使用sqlObject
·导入模块
from sqlobject import *
·定义MysqL使用的URI连接
MysqLuri="MysqL://user:password@host:port/database"
端口号为3306,一定要指定的。否则按照旧式连接方法里面,端口port属性设为None,就会抛出TypeError异常,因为要求必须是一个整数类型的端口号。如果按照新式的URI方式连接,如果不指定端口号则port默认为0,也会出现连接失败的问题。
sqlite的连接:
sqlite:///full/path/to/database
sqlite:/C|full/path/to/database
sqlite:/:memory:
postgre数据库的连接:
postgres://user@host/database?debug=&cache=
postgres://host:5432/database
·连接
conn=connectionForURI(MysqLuri)
sqlhub.processConnection=conn
·定义一个表格类
class Person(sqlObject):
firstName=StringCol()
middleInitial=StringCol(length=1,default=None)
lastName=StringCol() #by gashero
如果没有定义sqlhub,则需要使用Person._connection=conn来指定连接。
·创建表格
Person.createTable()
可以指定参数ifNotExists=True,仅仅在表格不存在时才创建这个表格。
·自动索引
自动给出一个叫做id的索引,所以不需要人为指定。
在MysqL中定义是:
INT PRIMARY KEY AUTO_INCREMENT
需要使用这个字段时,使用.id属性。
·创建一个对象
就是创建类的实例
Person(firstName="John",lastName="Doe")
在sqlObject中的NULL/None并不是代表缺省。NULL代表完全不同的事物、正文或者是人。有时NULL也代表缺省(default),有时代表不适用,有时代表未知。如果希望缺省一个值,可以使用NULL或其他。
sqlObject的default不同于数据库的default。sqlObject从不使用数据库的default。
注意,创建一个对象时,构造方法的参数必须要指定列名,也就是映射类的属性名,否则会出现异常。
·空值
如果在Person的实例中省略了firstName和lastName则会产生错误(by gashero),因为没有赋予缺省值。如果是赋予了缺省值的如middleInitial字段,则会被设为NULL值,等同于数据库的None。
·查询
可以使用类的.get(n)方法得到已经存在的实例。
当创建一个对象时,sqlObject会自动将其存入数据库,而不像其他系统那样,需要手动提交修改。另外,对已有对象的属性修改也会直接存入数据库。
列可以按照属性来存取。注意,对象是独一无二的(unique),如果两次获取同一ID的记录,则获得的是同一对象。这种机制可以确保多个线程存取同一对象时的一致性。当然,多个线程之间可以不共享对象实例。但是在使用事务(transaction)时,因为事务的隔离性而不成立。
·开启调试显示
同步显示sql语句和调试状态。建立连接时使用debug选项:
MysqL://user:passwd@host:port/database?debug=t
或:
Person._connection.debug=True
还可以选用的其他选项包括debugOutput(缺省为False),cache(True),autoCommit(True),debugThreading(False)。
在可以看到sql语句的情况下可以清除的理解工作过程(by gashero)。只需在连接URI中加入"?debug=t"即可。或者设置debug属性。这样,所有的sql语句都会打印到控制台。这是可靠的,也推荐使用。·set方法用于微弱的提高性能,一次指定多个属性,如:>>> p.set(firstName="Robert",lastName="Hope Jr.")·懒惰的更新缺省时,每修改一个属性就会导致一个UPDATE的发生,或者每次调用.set()时。如果想要避免(avoid)这种仿佛的更新,加入"_lazyUpdate=True"到类定义。这样只有在每次调用inst.syncUpdate()或者obj.sync()时才写入更新,.sync()也同时会取出数据库中的最新数据,而.syncUpdate()并不这样做。如果一个实例含有".sqlMeta.dirty"属性,就是用来指示含有未提交数据的属性。则插入动作会立即提交,这时是没有办法延迟提交的。