步骤 3: 数据库连接我们已经创建了一个能建立数据库连接的函数 connect_db ,但它本身并 不是很有用。总是创建或关闭数据库连接是相当低效的,所以我们会让连接 保持更长时间。因为数据库连接封装了事务,我们也需要确保同一时刻只有 一个请求使用这个连接。那么,如何用 Flask 优雅地实现呢? 这该是应用环境上场的时候了。那么,让我们开始吧。 Flask 提供了两种环境(Context):应用环境(Application Context)和 请求环境(Request Context)。暂且你所需了解的是,不同环境有不同的 特殊变量。例如 现在你只需要知道可以安全地在 那么你何时把数据库连接存放到它上面?你可以写一个辅助函数。这个函数 首次调用的时候会为当前环境创建一个数据库连接,调用成功后返回已经建 立好的连接: def get_db():
"""Opens a new database connection if there is none yet for the
current application context.
"""
if not hasattr(g, 'sqlite_db'):
g.sqlite_db = connect_db()
return g.sqlite_db
于是现在我们知道如何连接到数据库,但如何妥善断开连接呢?为此, Flask 提供了 @app.teardown_appcontext
def close_db(error):
"""Closes the database again at the end of the request."""
if hasattr(g, 'sqlite_db'):
g.sqlite_db.close()
好奇这些环境的意义?阅读 应用上下文 文档了解更多。 阅读 步骤 4: 创建数据库 以继续。 提示 我该把这些代码放在哪? 如果你一直遵循教程,你应该会问从此以后的步骤产生的代码放在 什么地方。逻辑上来讲,应该按照模块来组织函数,即把你新的 如果你需要来找准定位,可以看一下 示例源码 是怎么组织的。 在 Flask 中,你可以把你应用中所有的代码放在一个 Python 模块里。但你无需这么做,而且在你的应用 规模扩大 以后,这显然不妥。 步骤 4: 创建数据库正如之前介绍的,Flaskr 是一个数据库驱动的应用,更准确的说法 是,一个由关系数据库系统驱动的应用。关系数据库系统需要一个模 式来决定存储信息的方式。所以在第一次开启服务器之前,要点是创 建模式。 可以通过管道把 schema.sql 作为 sqlite3 命令的输入来创建这 个模式,命令为如下: sqlite3 /tmp/flaskr.db < schema.sql
这种方法的缺点是需要安装 sqlite3 命令,而并不是每个系统都有安 装。而且你必须提供数据库的路径,否则将报错。用函数来初始化数据 库是个不错的想法。 要这么做,我们可以创建一个名为 init_db 的函数来初始化数据库。 让我们首先看看代码。只需要把这个函数放在 flaskr.py 里的 connect_db 函数的后面: def init_db():
with app.app_context():
db = get_db()
with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit()
那么,这段代码会发生什么?还记得吗?上个章节中提到,应用环境在 每次请求传入时创建。这里我们并没有请求,所以我们需要手动创建一 个应用环境。
应用对象的 SQLite 的数据库连接对象提供了一个游标对象。游标上有一个方法可 以执行完整的脚本。最后我们只需提交变更。SQLite 3 和其它支持事 务的数据库只会在你显式提交的时候提交。 现在可以在 Python shell 导入并调用这个函数来创建数据库: >>> from flaskr import init_db
>>> init_db()
故障排除 如果你遇到了表无法找到的异常,请检查你是否确实调用过 init_db 函数并且表的名称是正确的(比如弄混了单数和复数)。 |
Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )
GMT+8, 2024-12-4 01:47 , Processed in 0.249403 second(s), 17 queries .