使用 SQLite 3

    下面是一个如何在 Flask 中使用 SQLite 3 的例子:

    现在,要使用数据库,应用必须要么有一个活动的应用情境(在存在请求的情况下, 总会有一个),要么创建一个应用情境。在这种情况下, 函数可以用于 获得当前数据库连接。一旦情境灭失,数据库连接就会中断。

    注意:如果使用 Flask 0.9 版或者更早版本,需要使用 flask._app_ctx_stack.top 代替 g ,因为 flask.g 对象绑定到请求而不是应用情境。

    示例:

    1. @app.route('/')
    2. def index():
    3. cur = get_db().cursor()
    4. ...

    Note

    在第一次使用时连接的好处是只会在真正需要的时候打开连接。如果需要在一个请求 情境之外使用这个代码,可以在 Python shell 中手动打开应用情境后使用:

    1. with app.app_context():
    2. # now you can use get_db()

    现在每个请求处理函数中可以通过 get_db() 来得到当前打开的数据库连接。一个 行工厂( row factory )可以简化 SQLite 的使用,它会在每个结果返回的时候对 返回结果进行加工。例如,为了得到字典型而不是元组型的结果,以下内容可以插入 到前文的 get_db 函数中:

    这样, sqlite3 模块就会返回方便处理的字典类型的结果了。更进一步,我们可以 把以下内容放到 get_db 中:

    1. db.row_factory = sqlite3.Row

    这样查询会返回 Row 对象,而不是字典。 Row 对象是 namedtuple ,因此既可以通过索引访问也以通过键访问。例如,假设我们有一个 sqlite3.Row 名为 ,记录包含 idFirstNameLastNameMiddleInitial 字段:

    1. >>> r['FirstName']
    2. John
    3. >>> # 或者基于索引取值
    4. >>> r[1]
    5. John
    6. # Row 对象是可迭代的:
    7. >>> for value in r:
    8. ... print(value)
    9. John
    10. M

    另外,提供一个函数,用于获得游标、执行查询和获取结果是一个好主意:

    使用该函数示例:

    1. for user in query_db('select * from users'):
    2. print user['username'], 'has the id', user['user_id']

    只需要得到单一结果的用法:

    1. user = query_db('select * from users where username = ?',
    2. [the_username], one=True)
    3. if user is None:
    4. print 'No such user'
    5. else:
    6. print the_username, 'has the id', user['user_id']

    如果要给 SQL 语句传递参数,请在语句中使用问号来代替参数,并把参数放在一个 列表中一起传递。不要用字符串格式化的方式直接把参数加入 SQL 语句中,这样会 给应用带来 的风 险。

    关系数据库是需要模式的,因此一个应用常常需要一个 schema.sql 文件来创建数 据库。因此我们需要使用一个函数,用来基于模式创建数据库。下面这个函数可以完 成这个任务:

    接下来可以在 Python shell 中创建数据库:

    1. >>> from yourapplication import init_db