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
				'
				)
				db_filename 
				=
				 os.path.abspath(
				'
				data.db
				'
				)
				2
				
						 if
				 os.path.exists(db_filename):
				
				if
				 os.path.exists(db_filename):
				3
				
						 os.unlink(db_filename)
    os.unlink(db_filename)
				4
				
						 connection_string 
				=
				 
				'
				sqlite:
				'
				 
				+
				 db_filename
connection_string 
				=
				 
				'
				sqlite:
				'
				 
				+
				 db_filename
				5
				
						 connection 
				=
				 connectionForURI(connection_string)
connection 
				=
				 connectionForURI(connection_string)
				6
				
						 sqlhub.processConnection 
				=
				 connection
sqlhub.processConnection 
				=
				 connection
		 3.生成一个简单的“地址薄”数据库,我们定义如下类:
1 class Person(SQLObject):
class Person(SQLObject):
2 firstName = StringCol()
    firstName = StringCol()
3 middleInitial = StringCol(length=1, default=None)
    middleInitial = StringCol(length=1, default=None)
4 lastName = StringCol()
    lastName = StringCol() 这个类对应的数据库Scheme如下:
 CREATE TABLE person (
CREATE TABLE person (
 id INT PRIMARY KEY AUTO_INCREMENT,
    id INT PRIMARY KEY AUTO_INCREMENT,
 first_name TEXT,
    first_name TEXT,
 middle_initial CHAR(1),
    middle_initial CHAR(1),
 last_name TEXT
    last_name TEXT
 );
);4.创建数据库表
很简单,就一句:
 Person.createTable()
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(firstName="John", lastName="Doe")
 <Person 1 firstName='John' middleInitial=None lastName='Doe'>
<Person 1 firstName='John' middleInitial=None lastName='Doe'>2.你可以用get()方法取出已经存在的某行:
 >>> Person.get(1)
>>> Person.get(1)
 <Person 1 firstName='John' middleInitial=None lastName='Doe'>
<Person 1 firstName='John' middleInitial=None lastName='Doe'>3.这是一个略长些的例子:
 >>> p = Person.get(1)
>>> p = Person.get(1)
 >>> p
>>> p
 <Person 1 firstName='John' middleInitial=None lastName='Doe'>
<Person 1 firstName='John' middleInitial=None lastName='Doe'>
 >>> p.firstName
>>> p.firstName
 'John'
'John'
 >>> p.middleInitial = 'Q'
>>> p.middleInitial = 'Q'
 >>> p.middleInitial
>>> p.middleInitial
 'Q'
'Q'
 >>> p2 = Person.get(1)
>>> p2 = Person.get(1)
 >>> p2
>>> p2
 <Person 1 firstName='John' middleInitial='Q' lastName='Doe'>
<Person 1 firstName='John' middleInitial='Q' lastName='Doe'>
 >>> p is p2
>>> p is p2
 True
True4.在这里,列被当作属性来访问。上述代码的“背后”又发生了什么呢?你可以在连接标识符中添加?debug=t,这样,在控制台中将打印出下面类似结果:
 >>> # This will make SQLObject print out the SQL it executes:
>>> # This will make SQLObject print out the SQL it executes:
 >>> Person._connection.debug = True
>>> Person._connection.debug = True
 >>> p = Person(firstName='Bob', lastName='Hope')
>>> p = Person(firstName='Bob', lastName='Hope')
 1/QueryIns:  INSERT INTO person (last_name, middle_initial, first_name) VALUES ('Hope',
 1/QueryIns:  INSERT INTO person (last_name, middle_initial, first_name) VALUES ('Hope', 

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