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.連接標(biāo)識符:
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:
可選的參數(shù):
debug (默認(rèn)值為False), debugOutput (默認(rèn)值為False), cache (默認(rèn)值為True), autoCommit (默認(rèn)值為True), debugThreading (默認(rèn)值為False).
如果你想傳遞一個(gè)True值到一個(gè)連接標(biāo)識符中,那么只需傳遞一個(gè)非空字符串就可以了;空字符串則表示False值。
2.建立一個(gè)連接
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.生成一個(gè)簡單的“地址薄”數(shù)據(jù)庫,我們定義如下類:
1
class?Person(SQLObject):
2
????firstName?=?StringCol()
3
????middleInitial?=?StringCol(length=1,?default=None)
4
????lastName?=?StringCol() 這個(gè)類對應(yīng)的數(shù)據(jù)庫Scheme如下:
CREATE?TABLE?person?(
????id?INT?PRIMARY?KEY?AUTO_INCREMENT,
????first_name?TEXT,
????middle_initial?CHAR(1),
????last_name?TEXT
);4.創(chuàng)建數(shù)據(jù)庫表
很簡單,就一句:
Person.createTable()5.更多
示例中firstName列為StringCol類型,當(dāng)然你也可以換成其它類型。具體可參照:
http://www.sqlobject.org/SQLObject.html#column-types
你或許已經(jīng)注意到了在類中并沒有定義id列,它是隱式的。在MySQL中,它被定義成INT PRIMARY KEY AUTO_INCREMENT,在Postgres中是SERIAL PRIMARY KEY,而在SQLite中則是INTEGER PRIMARY KEY。你必須把這些值當(dāng)作是不可變的。當(dāng)然,你也可以覆蓋“id”這個(gè)名字。
二.使用這個(gè)類
1.有了類,下面你需要做的就是創(chuàng)建一個(gè)新的對象(即新的一行),類實(shí)例化如下:
>>>?Person(firstName="John",?lastName="Doe")
<Person?1?firstName='John'?middleInitial=None?lastName='Doe'>2.你可以用get()方法取出已經(jīng)存在的某行:
>>>?Person.get(1)
<Person?1?firstName='John'?middleInitial=None?lastName='Doe'>3.這是一個(gè)略長些的例子:
>>>?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
True4.在這里,列被當(dāng)作屬性來訪問。上述代碼的“背后”又發(fā)生了什么呢?你可以在連接標(biāo)識符中添加?debug=t,這樣,在控制臺中將打印出下面類似結(jié)果:
>>>?#?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.作為一個(gè)小小的優(yōu)化,你可以將獨(dú)立地指定每個(gè)屬性值,換成一次指定多個(gè)值,使用set方法:
p.set(firstName='Robert',?lastName='Hope?Jr.')(未完待續(xù))
參考資料:
http://www.sqlobject.org/SQLObject.html