PEAR DB_Table 简介

翻译:ShiningRay @ NirvanaStudio

原文地址:http://wiki.ciaweb.net/yawiki/index.php?area=DB_Table

什么是 DB_Table?

DB_Table 是一个用于访问数据库表的面向对象接口。作为一个PEAR DB类的一个 包装,它提供了一些帮助你构建自动的创建、插入、更新和选择功能的方法。同时还有利用 HTML_QuickForm 自动构建输入表单的方法。

DB_Table提供了什么?

DB_Table 提供了:

  • 一个嵌在类属性中的模式描述系统,包括:
    • 列定义
    • 索引定义
    • 标准查询
    • 创建HTML_QuickForm元素的属性
  • 从描述的模式自动创建表
  • 一个抽象的API这样即便你改变了数据库后台也不需要改变你的PHP调用。这套API扩展了PEAR DB的功能,同时包含:
    • 用于根据预定义的SQL查询来获取一个结果数组的select() 方法
    • 用于根据预定义的SQL查询来获取一个PEAR DB_Result 对象的selectResult() 方法
    • create(), insert(), update(), 和 delete() 方法
    • 自动模式检验
    • 根据描述的表模式进行插入和更新字段时的自动检验
  • 时间和日期数据类型抽象,覆盖了数据库的原始数据类型
    • 即使你更改了数据库的后端,也无需修改你的查询。
    • 不需要通过类型转换方法来改变查询的值。
    • 当你插入或者更新列时,DB_Table 根据DB_Table 数据类型自动检验数据(datatype automatically (对所有的数据类型: integer, string,等等.).
  • 根据描述的模式自动创建HTML_QuickForm元素,利用以下方法:
    • getForm() 获取整个表单对象,有HTML_QuickForm元素和规则。
    • getFormGroup() 获取一组HTML_QuickForm元素。
    • getFormElement() 获取单一的HTML_QuickForm元素
    • addFormElements?() 对一个存在的HTML_QuickForm元素添加一个表单元素。
  • DB_Table 支持以下数据库(通过PEAR DB):
    • FrontBase
    • Microsoft SQL
    • MySQL
    • Oracle 8i
    • PostgreSQL
    • SQLite

类似的项目

PEAR MDBMDB2 提供真正的日期和时间数据类型的抽象,以及根据XML定义模式新建表的功能,但是它缺乏自动查询定义也不支持快速生成表单。同时,即使你在XML文件中定义了你的模式,每次进行查询的时候你还是要手工通知MDB/MDB2你的列类型是什么。

Metabase (by Manuel Lemos) 是PEAR MDB的祖先, Manuel也写了 Metastorage

PEAR DB_DataObject 是一个完整的数据对象封装器,支持完整的模式和连接表格,可以在一个外部的.ini文件中描述。

Propel 是“一个为PHP5设计的全服务对象持久和查询工具”。他的意思,用实际的语言说,就是Propel可以让你把你的数据库当成一系列的对象,提供了一套简便的API来存储和查询数据。其他与这类工具相关的名词有:对象关系映射(Object Relational Mapping, ORM)和数据访问对象(Data Access Objects,DAO)。Propel提供了一个生成器,用来创建SQL语句和PHP类同时提供了管理对象持久化和取回的运行时环境。

DB_DataContainer 和DB_Table十分相似。从网站上看“DB_DataContainer是一个PEAR兼容的数据库持久层和数据封装类。一个持久层封装了持久化对象所需要的行为,也就是,从一个持久存储器中载入、保存和删除对象,一般来说这个存储器是一个SQL数据库服务器。目前唯一支持的持久机制是关系数据库。数据库抽象由PEAR DB提供。未来将会提供对普通文件的支持。

使用XPWeb应用极限编程(隐喻)

隐喻

XP隐喻 (metaphor)必须能帮助你用可以理解的语言描述你的系统。

为了达到这个目的,我们可以在XP< /span>Web的“隐喻”一节中列出所有的隐喻术语。这些术语由一个名字/标题和他的解释组成。

“超描述”

通常作为“超描述”的东西现在是一个称为“文本模式”的一个大的功能特性。
如果在隐喻中定义了一个词,把{}放在词的两边,就可以把它变成“超词”……
注意你可以用词的复数形式(“words”可以找到“word”定义)。

事实上,搜索定义有三个级别:

  1. 搜索词的实际定义
  2. 如果没有结果,查找包含该词的那个词的定义。
  3. 最后,查找词的定义中包含该词的。

要获得更多的关于模式和如何修改的信息,看这里.

例子

参照只包含两个词的隐喻的例子,同时你注意第一个“连接”到了第二个。

尝试点击“senses”连接在第一个词的描述中,应该会出现一个弹出窗口连接到第二个词……

同时,通过点击“修改”,注意这个连接只会基于这个词的复数形式(用括号括出)。

使用XPWeb应用极限编程(安装)

ShiningRay @ NirvanaStudio

安装

安装 XP Web

  • 确保你已经拥有mysql(或者其他数据库,请在配置中指定)和一个可以运行PHP4或PHP5脚本的Web服务器(和相应的PHP库!如:如果要连接postgresql数据库必须启用php_pgsql扩展)。
  • [ 下载 ] the latest version of the tool (XPWeb.tgz 或者 XPWeb.zip).
  • [ 解压 ] (unzip 或者 ungzip 和 untar) 文档.
  • 把目录中的XPWeb 目录放到那个可以运行PHP和数据库的网络服务器的目录中。
  • 你也许想在配置文件里[ 配置 ] 一些参数,例如数据库名称,登录名和密码 ,
    注意:配置十分重要,包括负载因子和其他参数,必须在初始化/更新数据库之前完成……

    You should do this in a [ 本地配置]

    你只要新建一个 [ Config_local.inc.php ] 文件,并把它放到XPWeb的根目录下 -和Config.inc.php同一位置- 并且将你要“本地化”的设置从 Config.inc.php 中复制过来。

    你在本地进行的设置会覆盖默认的设置,那些没有放在本地文件中的设置就会设为默认。

    既然这样当升级到新的XPWeb的时候,可能会有一些新的默认设置,但不用担心你已经存在的本地设置(分发包里面不包含Config_local.inc.php文件,所以可以保证你在升级的时候原来的设置不会被覆盖……)
    这里有一个完整的Config_local.inc.php 文件的例子:

    <?php

    defineOnce(“XP_REPORT_TEMP_PATH”,”../../temp”);

    defineOnce(“XP_DEFAULT_LANGUAGE”,”fr”);

    defineOnce(“XP_DB_PASS”,”myPass”);

    ?>

    记住你无需复制所有的设置,只需要那些你要对默认设置进行改变的那些值……

  • 使用浏览器访问 [ index.php ] 页面,这时页面应该给出一个连接来新建或者初始化数据库。

升级 XP Web

任何XPWeb 的升级都会保证你所有的数据安全,当然也不会改变你使用 XPWeb 的习惯;-)

  • 如何创建一个本地的配置文件已经在上面解释过了。如果你已经有了一个文件, [ keep it safe ].
  • 按照一般安装的步骤替换你的XPWeb 目录(你不会丢失任何项目数据)。
  • 只要简单的 复制 你的 Config_local.inc.php文件到 XPWeb 根目录 (XPWeb/).
  • 浏览[ XPWeb/index.php ] 并按照他的指示来更新数据库。
    注意: 在进行数据库初始化或更新之前必须有一个正确的配置文件……
  • 好了,你肯定跃跃欲试了!
  • XPWeb 2.2之前版本进行升级的注意点

    XPWeb 直到2.2,任务是用“完成百分率”表示的。从2.2到以后,你要使用“done”和“todo”字段来替代。数据库的升级会删除“actual completion”(实际完成)字段并且生成相应的“done”和“todo”字段。确保你想要直接跳到当前版本。
    你也许应该考虑在升级之前备份一下你的数据库……

问题?

  • 你的Web服务器的配置文件应该说明以“.php”为扩展名的文件是PHP代码文件并且 “<?php” 和 “?>” 之间的代码是 php (这时通常的配置).
  • 要有一个正在运行的数据库服务器同时你必须在Config_local.inc.php中指定正确的 [ 数据库 用户/密码] 参数。
  • 如果你在身分验证上遇到了麻烦,你可以检查PHP Session 配置。你需要能在Web服务器上能处理Session文件。
    你也可以改变Config_local.inc.php 中的XP_SESSION_PATH 参数
  • 不能管理选择当前的项目或者在本地网络上登录 XPWeb ?
    这里有一个对于IE的 已知的bug你可能感兴趣(服务器名不能包含点)。
  • 请在你想问我们关于PHP的配置的问题前检查一下 php.net 手册……
  • 一般来说,关于[ 使用 ] 而不是 [ 安装 ] XPWeb的帮助, 请记得参考内部的帮助文件。
  • 请访问Sourceforge.net上的在线论坛来获得更多的帮助。

相关连接

  • XPWeb网站
  • XP Web 在Sourceforge.net上的论坛


  • Wampserver PHP/MySql for Windows
  • 熵.ch PHP5 for Mac OS X
  • PHP 安装
  • MySql 安装
  • CVSWeb
  • xUnit 测试框架
  • XProgramming.com
  • 其他 XP 软件
  • 极限编程Wiki

使用XPWeb应用极限编程(文档)

Doc

文档部分包括四个很相似的子部分:

  • 模型(modeling) 与模型相关的连接
  • Doc文档 其他文档文件
  • Javadoc Javadocs… 够明确了吧?
  • 目录(Directories) 你希望被显示以便直接显示并访问其中的文件而不需要添加指定文档。

这些连接都在项目部分中定义.

注意如果项目的这些部分中只有一个连接被定义了,点击“Doc”标签会默认直接打开它。
再次点击“Doc”标签会把你带回“通常”的文档部分,显示所有的子部分。

打开 / 下载文档 –

所有这些文档都要遵守同一个原则:

  • 文档会在一个框架页中打开,同时如果Web浏览器支持它的格式,它就会在页面中打开。
  • 如果你知道浏览器不支持文档的格式,最好在新的窗口中打开(同时它可能会弹出一个对话框让你下载这个文档)

目录

目录十分特殊。

这是一种无需一个个手工添加文档就可以访问文档的方法。
层次结构可以通过点击子目录来打开。

注意:配置目录的时候要小心,因为如果层次很复杂的话页面显示会要用很长时间。
只能够选择本地的目录。

这里有一个View目录的例子 (一些按钮被禁止了).

Python 不是 Java

作者:Phillip J. Eby.

翻译:ShiningRay @ NirvanaStudio

原文地址:http://dirtsimple.org/2004/12/python-is-not-java.html


我最近正在看一个基于wxPython的GUI应用程序,大概45.5KLOC的样子,但我没有计算它用到的库的大小(如Twisted)。代码是由那些对Python相对生疏的Java的开发者写的,所以程序有很严重的性能问题(如三十秒的启动时间)。我在检查代码的时候发现他们写了很多对Java有意义但是对Python却很恐怖的东西。并不是因为“Python比Java慢”,而是因为在Python中有更方便的方法去完成同样的目标,甚至在Java中不可能的事情。

所以,可悲的事就是这些可怜人事倍功半,产生了很多很多不需要写的代码,从而比相应合乎Python习惯的写法慢得多得多。我们来看一些例子:

  • 在Java中一个静态的方法(static)不能翻译成一个Python的类方法(classmethod)。哦,当然,多多少少他最终产生类似的效果,但类方法的目的实际上是做了一些通常在Java中不可能的事(如继承一个非默认的构造函数)。Java静态方法的习惯翻译通常是一个模块级函数,而不是一个类方法或静态方法(staticmethod)。(同时静态封闭(final)字段应该翻译成模块级常量。)

    这并不是一个性能上的问题,但是一个Python程序员要用像这些类似Java习惯的代码的话,可能就会被在该输入Foo.someFunction时却要输入Foo.Foo.someMethod这种情况给惹毛了。但是请注意:调用一个类方法将会比调用一个静态方法和函数要多一部分额外的内存。

    啊,那些Foo.Bar.Baz也不是省油的。在Java中,这些点分割的名称是由编译器去查找的,所以运行时根本无所谓你有多少点。在Python中,每次运行时都要查找,所以每个点都要计算在内。(Python中一定要记住这点,“平铺比嵌套好”,尽管比起性能,他和“可读性”和“简单就是美”更靠近。)

  • 要用switch语句?Python翻译将是一个哈希表,不是一堆if-then语句。用一堆if-then在Java中也不是switch语句,如果有字符串参与了呢?他其实是一个哈希表。CPython字典实现用了性能最佳—在我们宇宙中目前所知道的—的哈希表的实现之一。你自己所写的代码也不会比这个再好了,除非你是Guido、Tim Peters和Raymond Hettinger的“私生子”——还是遗传增强了的。
  • XML不是答案。它也不是一个问题。要在正则表达式上解释Jamie Zawinski,“一些人,当遇到一个问题的时候,就想‘我知道,我要用XML’那这个时候,他们就有两个问题了。”

    和Java比,这是一个不同的情况。因为比起Java代码,XML是轻巧而且有弹性的。但比起Python的代码来,XML就是一个船锚,一个绊脚石。在Python中,XML是用来做交换,而不是你的核心功能,因为你不需要这么做。在Java中,XML可能是你的大救星因为他让你实现了特定领域的语言并“不通过编码”提高了你的应用程序的适应性。在Java中,避免编码是一个很大的优势,因为编码意味着重新编译。但在Python中,更常见的是,写代码比写XML更方便简单。同时Python处理代码要远远比处理XML快。(不仅仅是这个,你必须书XML处理代码,同时Python自身就已经为你准备好了。)

    如果你是一个Java程序员,对于你是否要在你的Python核心应用中使用XML作为一部分,不要相信你的本能。如果你不是因为信息交互的原因去实现一个已经存在的XML标准或是建立某种导入、导出格式或者建立某种XML编辑器或处理工具,那么就不要这么做。一次也别。甚至连想都不要想。现在,扔掉那个XML模式把你的手解放吧!如果你的应用程序或者平台要被Python开发者使用,他们只会感谢你不要在他们的工作量中添加使用XML的负担。

    (这里唯一的例外是如果你的受众的的确确,确确实实需要XML,出于某种奇怪的理由。像,他们拒绝学习Python并只对你使用了XML而付钱给你,或者你打算给他们一个编辑XML的GUI,同时这个写XML的GUI呢是另一个人写的,同时你得到免费使用的权利。还有一些很少见的架构上的原因需要用到XML。相信我,他们不会出现在你的程序中。如果有疑问,对一个资深的Python开发员解释你的用例。或者,如果你脸皮厚的话,试试向一个Lisp程序解释你的程序为什么要用XML!)

  • Getter和setter是坏蛋。坏蛋,魔鬼!Python对象不是Java Bean。不要写什么getter和setter,然后还把它们包装在“属性”里面。它直到你能证明你需要比一个简单访问复杂一点的功能时才有意义,否则,不要写getter和setter。它们是CPU时间的浪费,更要紧的是,它们还是程序员宝贵时间的极大浪费。不仅仅对于写代码和测试的人,对于那些要阅读和理解它们的人也是。

    在Java中,你必须使用getter和setter因为公共字段不允许你以后改变想法再去使用getter和setter。在Python中,这样做很傻,因为你可以以一个普通特性开始并可以在任何时间改变你的想法,而不用影响到这个类的任何客户。所以不要写getter和setter。

  • 代码重复在Java中常常是一个不得不要的魔鬼,你必须经常一遍一遍写同一个方法而只有一点点的变化(通常是因为静态类型约束)。在Python中这样做是没有必要的也是不值得的(除了极少数一些特定的场合需要内联一些要求性能的函数)。如果你发现自己一遍一遍在写同样的代码而且变化很少,你就需要去学一下闭包。他们并不是真的很可怕。

    这就是你要做的。你写了一个包含了函数的函数。这里内部的函数就是你要一遍遍写的函数的模版,但是在里面加入了针对不同情况的函数要使用变量。外部的函数需要刚刚提高的那种变量作为参数,并且将内部的函数作为结果返回。然后,每次你要写另一种略微不同的函数的时候,你只要调用这个外部的函数,并且把返回值赋给你要让“重复”函数出现的名字。现在,如果你需要改变这个工作方式,你只要改变一个地方:这个模版。

在我所看过的应用程序/平台中,只有一个很微不足道的程序使用了这个技术之后可以去掉数百行重复代码。事实上,自从开发者使用了特别的样板文件来为这平台开发插件,这会节省很多很多第三方开发人员的代码,同时也使那些程序员要学习的东西简化了。

这只是Java->Python思维方式转变的冰山一角而已,现在我可以让他转变成正确的而不用钻研这个程序的细节。本质上,如果你曾经用过一段时间Java,而且对Python比较陌生,不要太相信自己的本能。你的本能已经为Java调节,而不是Python。向后退一步,最重要的,不要写这么多代码了。

要这样做,让自己觉得更加需要Python。假装好像Python是可以做任何你想做的魔棒,却让你无须动一个手指。问一下,“Python是怎样解决我的问题的?”还有“Python语言的哪个特点和我的问题最相似?”你绝对会惊讶于你需要的东西其实已经有了某种固定形式。事实上,这种现象实在是太普遍了,甚至在很有经验的Python程序员中也会出现,以至于Python社区中给这种现象起了个名字。我们称之为“GUIDO的时间机器”,因为有时候看上去得到我们所需要的东西好像只有他知道的一种方法,但当我们自己知道了就不一样了。

所以,如果你不能感到你在使用Python时至少比用Java要多出10倍的生产力,!(同时如果你还怀念你的Java IDE,考虑一下这种可能性:因为你写的Python程序比他所需要的要复杂得多)


附录:(翻译自此篇文章的评论)

确实,哈希表==字典。举个最简单的例子,从Python

标准库中检出“pickle”和“copy”模块,这两个模块会从字典中查找类型并调用相应的函数。另一个有些诡异的例子是范型函数,我已经在最近的Blog中写了一下。

关于闭包的例子,我这里给出一个很笨的例子。假设你要写很多这样的函数:

def addOne(x): return x+1
def addTwo(x): return x+2

然后你可以这样写:

def makeAdder(addend):
… def add_it(x): return x+addend
… return add_it

并且这样使用:

addOne = makeAdder(1)
addTwo = makeAdder(2)

这样就可以等同于原来的定义了。

相关资料:http://www.razorvine.net/python/PythonForJavaProgrammers

让人无语的标示符名起法

同学今天做软件测试,让我帮他看代码,代码说是以前研究生留下来的……
我一看到他的变量名,我就无语了,什么yuju, denglu……
怎么用拼音呢??反而增加了理解的难度。我也看到很多人说,用拼音做标示符是很差的习惯……
其实,直接输入中文不就行了么……

Java也不是不可以用中文作标示符,他支持Unicode….
如果只是想让中国人看,那还是用中文吧,或者写在注释里面

QBASIC中的活动图像

翻译:ShiningRay

在QBASIC中使用BSAVE和BLOAD

翻译:ShiningRay