使用 SQLite 3
下面是一个如何在 Flask 中使用 SQLite 3 的例子:
现在,要使用数据库,应用必须要么有一个活动的应用情境(在存在请求的情况下, 总会有一个),要么创建一个应用情境。在这种情况下, 函数可以用于 获得当前数据库连接。一旦情境灭失,数据库连接就会中断。
注意:如果使用 Flask 0.9 版或者更早版本,需要使用 flask._app_ctx_stack.top
代替 g
,因为 flask.g 对象绑定到请求而不是应用情境。
示例:
@app.route('/')
def index():
cur = get_db().cursor()
...
Note
在第一次使用时连接的好处是只会在真正需要的时候打开连接。如果需要在一个请求 情境之外使用这个代码,可以在 Python shell 中手动打开应用情境后使用:
with app.app_context():
# now you can use get_db()
现在每个请求处理函数中可以通过 get_db() 来得到当前打开的数据库连接。一个 行工厂( row factory )可以简化 SQLite 的使用,它会在每个结果返回的时候对 返回结果进行加工。例如,为了得到字典型而不是元组型的结果,以下内容可以插入 到前文的 get_db
函数中:
这样, sqlite3 模块就会返回方便处理的字典类型的结果了。更进一步,我们可以 把以下内容放到 get_db
中:
db.row_factory = sqlite3.Row
这样查询会返回 Row 对象,而不是字典。 Row 对象是 namedtuple
,因此既可以通过索引访问也以通过键访问。例如,假设我们有一个 sqlite3.Row
名为 ,记录包含 id
、 FirstName
、 LastName
和 MiddleInitial
字段:
>>> r['FirstName']
John
>>> # 或者基于索引取值
>>> r[1]
John
# Row 对象是可迭代的:
>>> for value in r:
... print(value)
John
M
另外,提供一个函数,用于获得游标、执行查询和获取结果是一个好主意:
使用该函数示例:
for user in query_db('select * from users'):
print user['username'], 'has the id', user['user_id']
只需要得到单一结果的用法:
user = query_db('select * from users where username = ?',
[the_username], one=True)
if user is None:
print 'No such user'
else:
print the_username, 'has the id', user['user_id']
如果要给 SQL 语句传递参数,请在语句中使用问号来代替参数,并把参数放在一个 列表中一起传递。不要用字符串格式化的方式直接把参数加入 SQL 语句中,这样会 给应用带来 的风 险。
关系数据库是需要模式的,因此一个应用常常需要一个 schema.sql 文件来创建数 据库。因此我们需要使用一个函数,用来基于模式创建数据库。下面这个函数可以完 成这个任务:
接下来可以在 Python shell 中创建数据库:
>>> from yourapplication import init_db