What's SQLObject?
SQLObject is a popular Object Relational Manager for providing an object interface to your database, with tables as classes, rows as instances, and columns as attributes.
I think the explanation is simple and enough, so let's start!

一.定义类
1.连接标识符:
scheme://[user[:password]@]host[:port]/database[?parameters]
其中scheme是sqlite, mysql, postgres, firebird, interbase, maxdb, sapdb, mssql, sybase其中之一;
示例:
mysql://user:passwd@host/database
mysql://host/database?debug=1
postgres://user@host/database?debug=&cache=
postgres://host:5432/database
sqlite:///full/path/to/database
sqlite:/C|/full/path/to/database
sqlite:/:memory:
可选的参数:
debug (默认值为False), debugOutput (默认值为False), cache (默认值为True), autoCommit (默认值为True), debugThreading (默认值为False).
如果你想传递一个True值到一个连接标识符中,那么只需传递一个非空字符串就可以了;空字符串则表示False值。
2.建立一个连接

1 db_filename  =  os.path.abspath( ' data.db ' )
2 if  os.path.exists(db_filename):
3     os.unlink(db_filename)
4 connection_string  =   ' sqlite: '   +  db_filename
5 connection  =  connectionForURI(connection_string)
6 sqlhub.processConnection  =  connection
3.生成一个简单的“地址薄”数据库,我们定义如下类:
1 class  Person(SQLObject):
2     firstName  =  StringCol()
3     middleInitial  =  StringCol(length = 1 , default = None)
4     lastName  =  StringCol()
这个类对应的数据库Scheme如下:
CREATE   TABLE  person (
    id 
INT   PRIMARY   KEY  AUTO_INCREMENT,
    first_name 
TEXT ,
    middle_initial 
CHAR ( 1 ),
    last_name 
TEXT
);
4.创建数据库表
很简单,就一句:
Person.createTable()

5.更多
示例中firstName列为StringCol类型,当然你也可以换成其它类型。具体可参照:
http://www.sqlobject.org/SQLObject.html#column-types
你或许已经注意到了在类中并没有定义id列,它是隐式的。在MySQL中,它被定义成INT PRIMARY KEY AUTO_INCREMENT,在Postgres中是SERIAL PRIMARY KEY,而在SQLite中则是INTEGER PRIMARY KEY。你必须把这些值当作是不可变的。当然,你也可以覆盖“id”这个名字。

二.使用这个类
1.有了类,下面你需要做的就是创建一个新的对象(即新的一行),类实例化如下:

>>>  Person(firstName = " John " , lastName = " Doe " )
< Person  1  firstName = ' John '  middleInitial = None lastName = ' Doe ' >
2.你可以用get()方法取出已经存在的某行:
>>>  Person.get( 1 )
< Person  1  firstName = ' John '  middleInitial = None lastName = ' Doe ' >
3.这是一个略长些的例子:
>>>  p  =  Person.get( 1 )
>>>  p
< Person  1  firstName = ' John '  middleInitial = None lastName = ' Doe ' >
>>>  p.firstName
' John '
>>>  p.middleInitial  =   ' Q '
>>>  p.middleInitial
' Q '
>>>  p2  =  Person.get( 1 )
>>>  p2
< Person  1  firstName = ' John '  middleInitial = ' Q '  lastName = ' Doe ' >
>>>  p  is  p2
True

4.在这里,列被当作属性来访问。上述代码的“背后”又发生了什么呢?你可以在连接标识符中添加?debug=t,这样,在控制台中将打印出下面类似结果:

>>>   #  This will make SQLObject print out the SQL it executes:
>>>  Person._connection.debug  =  True
>>>  p  =  Person(firstName = ' Bob ' , lastName = ' Hope ' )
 
1 / QueryIns:  INSERT INTO person (last_name, middle_initial, first_name) VALUES ( ' Hope '

NULL, 
' Bob ' )
 
1 / COMMIT  :  auto
 
1 / QueryOne:  SELECT first_name, middle_initial, last_name FROM person WHERE id  =   2
 
1 / COMMIT  :  auto
>>>  p
< Person  2  firstName = ' Bob '  middleInitial = None lastName = ' Hope ' >
>>>  p.middleInitial  =   ' Q '
 
1 / Query   :  UPDATE person SET middle_initial  =   ' Q '  WHERE id  =   2
 
1 / COMMIT  :  auto
>>>  p2  =  Person.get( 1 )
>>>   #  Note: no database access, since we're just grabbing the same
>>>   #  instance we already had.
上述代码,可以清晰地看出“后台”所做的事情。
5.作为一个小小的优化,你可以将独立地指定每个属性值,换成一次指定多个值,使用set方法:
p.set(firstName = ' Robert ' , lastName = ' Hope Jr. ' )

(未完待续)

参考资料: http://www.sqlobject.org/SQLObject.html

欢迎大家访问我的个人网站 萌萌的IT人