定义和操作数据库

    使用 SQLite 的便利性在于不需要单独配置一个数据库服务器,并且 Python 提供了 内置支持。但是当并发请求同时要写入时,会比较慢一点,因为每个写操作是按顺序 进行的。小应用没有问题,但是大应用可能就需要考虑换成别的数据库了。

    本教程不会详细讨论 SQL 。如果你不是很熟悉 SQL ,请先阅读 SQLite 文档中的 相关内容

    当使用 SQLite 数据库(包括其他多数数据库的 Python 库)时,第一件事就是创建 一个数据库的连接。所有查询和操作都要通过该连接来执行,完事后该连接关闭。

    在网络应用中连接往往与请求绑定。在处理请求的某个时刻,连接被创建。在发送响应 之前连接被关闭。

    是一个特殊对象,独立于每一个请求。在处理请求过程中,它可以用于储存 可能多个函数都会用到的数据。把连接储存于其中,可以多次使用,而不用在同一个 请求中每次调用 get_db 时都创建一个新的连接。

    current_app 是另一个特殊对象,该对象指向处理请求的 Flask 应用。这里 使用了应用工厂,那么在其余的代码中就不会出现应用对象。当应用创建后,在处理 一个请求时, get_db 会被调用。这样就需要使用 。

    sqlite3.connect() 建立一个数据库连接,该连接指向配置中的 DATABASE 指定的文件。这个文件现在还没有建立,后面会在初始化数据库的时候建立该文件。

    close_db 通过检查 g.db 来确定连接是否已经建立。如果连接已建立,那么 就关闭连接。以后会在应用工厂中告诉应用 close_db 函数,这样每次请求后就会 调用它。

    在 SQLite 中,数据储存在 中。在储存和调取数据之前需要先创建它们。 Flaskr 会把用户数据储存在 user 表中,把博客内容储存在 post 表中。下面 创建一个文件储存用于创建空表的 SQL 命令:

    flaskr/schema.sql

    1. DROP TABLE IF EXISTS user;
    2. DROP TABLE IF EXISTS post;
    3. CREATE TABLE user (
    4. username TEXT UNIQUE NOT NULL,
    5. password TEXT NOT NULL
    6. CREATE TABLE post (
    7. id INTEGER PRIMARY KEY AUTOINCREMENT,
    8. author_id INTEGER NOT NULL,
    9. created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    10. body TEXT NOT NULL,
    11. FOREIGN KEY (author_id) REFERENCES user (id)
    12. );

    db.py 文件中添加 Python 函数,用于运行这个 SQL 命令:

    flaskr/db.py

    打开一个文件,该文件名是 相对于 flaskr 包的。这样就不需要考虑以后应用具体部署在哪个位置。 get_db 返回一个数据库连接,用于执行文件中的命令。

    click.command() 定义一个名为 init-db 命令行,它调用 init_db 函数,并为用户显示一个成功的消息。 更多关于如何写命令行的内容请参阅 doc:/cli 。

    close_db 和 函数需要在应用实例中注册,否则无法使用。 然而,既然我们使用了工厂函数,那么在写函数的时候应用实例还无法使用。代替地, 我们写一个函数,把应用作为参数,在函数中进行注册。

    1. def init_app(app):
    2. app.teardown_appcontext(close_db)
    3. app.cli.add_command(init_db_command)

    告诉 Flask 在返回响应后进行清理的时候调用此函数。

    app.cli.add_command() 添加一个新的 可以与 flask 一起工作的命令。

    在工厂中导入并调用这个函数。在工厂函数中把新的代码放到 函数的尾部,返回应用代码的前面。

    flaskr/__init__.py

    现在 init-db 已经在应用中注册好了,可以与 flask 命令一起使用了。 使用的方式与前一页的 run 命令类似。

    Note

    如果你还在运行着前一页的服务器,那么现在要么停止该服务器,要么在新 的终端中运行这个命令。如果是新的终端请记住在进行项目文件夹并激活环 境,参见 。同时还要像前一页所述设置 FLASK_APPFLASK_ENV

    运行 init-db 命令:

    1. $ flask init-db
    2. Initialized the database.

    下面请阅读 蓝图和视图