访问数据库¶
网页.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是 mysql 和 sqlite 对于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')
和使用 db1 , db2 分别访问这些数据库。
操作¶
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)
高级查询¶
很多时候,与数据库有关的事情更多,而不是简单的操作 insert , select , delete 和 update -像你最喜欢的(或可怕的)连接,计数等等。所有这些都是可能的 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()