访问数据库

网页.py为要使用的数据库提供一个简单而统一的接口,无论它是PostgreSQL、MySQL、SQLite还是其他任何数据库。它不会试图在你和你的数据库之间建立层。相反,它试图让执行普通任务变得更容易,当你需要做更高级的事情时,你可以不碍事。

创建数据库对象

使用数据库的第一件事网页.py创建一个创建数据库对象 web.database() . 它返回数据库对象,其中有方便的方法供您使用。

请确保安装了适当的数据库库 (psycopg2 对于PostgreSQL, MySQLdb 对于MySQL, sqlite3 对于SQLite)。

db = web.database(dbn='postgres', db='dbname', user='username', pw='password')

dbn 对于MySQL是 mysqlsqlite 对于SQLite。SQLite不需要 user pw 参数。

关闭数据库连接:

db.ctx.db.close()

Multiple databases

使用更多的数据库并不困难网页.py. 这就是你要做的。

db1 = web.database(dbn='postgres', db='dbname1', user='username1', pw='password2')
db2 = web.database(dbn='postgres', db='dbname2', user='username2', pw='password2')

和使用 db1db2 分别访问这些数据库。

操作

web.database() 返回一个对象,该对象为您提供从数据库中插入、选择、更新和删除数据的所有功能。对于上的每个方法 db below, you can pass `_ test=True`查看SQL语句而不是执行它。

插入

# Insert an entry into table 'user'
userid = db.insert('user', firstname="Bob", lastname="Smith", joindate=web.SQLLiteral("NOW()"))

第一个参数是表名,其余参数是表示表中字段的命名参数集。如果没有给定值,数据库可能会创建默认值或发出警告。

对于批量插入而不是逐个插入记录,请使用 Multiple Inserts 相反。

选择

这个 select 方法用于从数据库中选择行。它返回一个 web.iterbetter 对象,它可以循环通过。

选择 all 来自 user 桌上,你只需要

users = db.select('user')

对于真实世界的用例, select method takes vars, what, where, order, group, limit, offset, and `_ test`可选参数。

users = db.select('users', where="id>100")

要防止SQL注入攻击,可以使用 $key 在where子句中传递 vars 它有{‘key’:value}。

vars = dict(name="Bob")
results = db.select('users', where="name = $name", vars=vars, _test=True)
>>> results
<sql: "SELECT * FROM users WHERE name = 'Bob'">

正在更新

这个 update 方法接受与Select相同类型的参数。它返回更新的行数。

num_updated  = db.update('users', where="id = 10", firstname = "Foo")

删除

这个 delete 方法返回删除的行数。它还接受“using”和“vars”参数。看到了吗 Selecting 有关更多详细信息 vars .

num_deleted = db.delete('users', where="id=10")

插入多个

这个 multiple_insert 方法在 db 对象允许您这样做。所有需要做的就是准备一个字典列表,每一行都有一个要插入的行,每一行都有相同的键集并将其传递给 multiple_insert 以及表名。它返回插入行的id列表。

价值 db.supports_multiple_insert 告诉您数据库是否支持多个插入。:

values = [{"name": "foo", "email": "foo@example.com"}, {"name": "bar", "email": "bar@example.com"}]
db.multiple_insert('person', values=values)

高级查询

很多时候,与数据库有关的事情更多,而不是简单的操作 insertselectdeleteupdate -像你最喜欢的(或可怕的)连接,计数等等。所有这些都是可能的 query 方法,也需要 vars .

results = db.query("SELECT COUNT(*) AS total_users FROM users")
print results[0].total_users # prints number of entries in 'users' table

连接表:

results = db.query("SELECT * FROM entries JOIN users WHERE entries.author_id = users.id")

交易

数据库对象有一个方法 transaction 它启动一个新事务并返回事务对象。事务对象可用于提交或回滚该事务。也可以有嵌套事务。

从Python2.5开始,支持 with 声明,你会的

with db.transaction():
    userid = db.insert('users', name='foo')
    authorid = db.insert('authors', userid=userid)

对于Python的早期版本,您可以

t = db.transaction()
try:
    userid = db.insert('users', name='foo')
    authorid = db.insert('authors', userid=userid)
except:
    t.rollback()
    raise
else:
    t.commit()