[SQLObject官方文档] 基础

使用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"属性,就是用来指示含有未提交数据的属性。则插入动作会立即提交,这时是没有办法延迟提交的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值