本站首页    管理页面    写新日志    退出


«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7615132
建立时间:2006年5月29日




[Python]SQLObject简明教程(一)
软件技术

lhwork 发表于 2007/1/10 9:47:17

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/databasemysql://host/database?debug=1postgres://user@host/database?debug=&cache=postgres://host:5432/databasesqlite:///full/path/to/databasesqlite:/C|/full/path/to/databasesqlite:/:memory:可选的参数:debug (默认值为False), debugOutput (默认值为False), cache (默认值为True), autoCommit (默认值为True), debugThreading (默认值为False).如果你想传递一个True值到一个连接标识符中,那么只需传递一个非空字符串就可以了;空字符串则表示False值。2.建立一个连接 1 500)this.width=500'> db_filename  =  os.path.abspath( ' data.db ' )2 500)this.width=500'> if  os.path.exists(db_filename):3 500)this.width=500'>    os.unlink(db_filename)4 500)this.width=500'>connection_string  =   ' sqlite: '   +  db_filename5 500)this.width=500'>connection  =  connectionForURI(connection_string)6 500)this.width=500'>sqlhub.processConnection  =  connection 3.生成一个简单的“地址薄”数据库,我们定义如下类: 1500)this.width=500'>class Person(SQLObject):2500)this.width=500'>    firstName = StringCol()3500)this.width=500'>    middleInitial = StringCol(length=1, default=None)4500)this.width=500'>    lastName = StringCol()这个类对应的数据库Scheme如下: 500)this.width=500'>CREATE TABLE person (500)this.width=500'>    id INT PRIMARY KEY AUTO_INCREMENT,500)this.width=500'>    first_name TEXT,500)this.width=500'>    middle_initial CHAR(1),500)this.width=500'>    last_name TEXT500)this.width=500'>);4.创建数据库表很简单,就一句: 500)this.width=500'>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.有了类,下面你需要做的就是创建一个新的对象(即新的一行),类实例化如下: 500)this.width=500'>>>> Person(firstName="John", lastName="Doe")500)this.width=500'><Person 1 firstName='John' middleInitial=None lastName='Doe'>2.你可以用get()方法取出已经存在的某行: 500)this.width=500'>>>> Person.get(1)500)this.width=500'><Person 1 firstName='John' middleInitial=None lastName='Doe'>3.这是一个略长些的例子: 500)this.width=500'>>>> p = Person.get(1)500)this.width=500'>>>> p500)this.width=500'><Person 1 firstName='John' middleInitial=None lastName='Doe'>500)this.width=500'>>>> p.firstName500)this.width=500'>'John'500)this.width=500'>>>> p.middleInitial = 'Q'500)this.width=500'>>>> p.middleInitial500)this.width=500'>'Q'500)this.width=500'>>>> p2 = Person.get(1)500)this.width=500'>>>> p2500)this.width=500'><Person 1 firstName='John' middleInitial='Q' lastName='Doe'>500)this.width=500'>>>> p is p2500)this.width=500'>True 4.在这里,列被当作属性来访问。上述代码的“背后”又发生了什么呢?你可以在连接标识符中添加?debug=t,这样,在控制台中将打印出下面类似结果: 500)this.width=500'>>>> # This will make SQLObject print out the SQL it executes:500)this.width=500'>>>> Person._connection.debug = True500)this.width=500'>>>> p = Person(firstName='Bob', lastName='Hope')500)this.width=500'> 1/QueryIns:  INSERT INTO person (last_name, middle_initial, first_name) VALUES ('Hope', 500)this.width=500'>500)this.width=500'>NULL, 'Bob')500)this.width=500'> 1/COMMIT  :  auto500)this.width=500'> 1/QueryOne:  SELECT first_name, middle_initial, last_name FROM person WHERE id = 2500)this.width=500'> 1/COMMIT  :  auto500)this.width=500'>>>> p500)this.width=500'><Person 2 firstName='Bob' middleInitial=None lastName='Hope'>500)this.width=500'>>>> p.middleInitial = 'Q'500)this.width=500'> 1/Query   :  UPDATE person SET middle_initial = 'Q' WHERE id = 2500)this.width=500'> 1/COMMIT  :  auto500)this.width=500'>>>> p2 = Person.get(1)500)this.width=500'>>>> # Note: no database access, since we're just grabbing the same500)this.width=500'>>>> # instance we already had.上述代码,可以清晰地看出“后台”所做的事情。5.作为一个小小的优化,你可以将独立地指定每个属性值,换成一次指定多个值,使用set方法: 500)this.width=500'>p.set(firstName='Robert', lastName='Hope Jr.')(未完待续)参考资料:http://www.sqlobject.org/SQLObject.html


阅读全文(2027) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144786300 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号