介绍上下文

如果你计划只使用一个应用,你大可跳过这章。只需要把你的应用传递给 SQLAlchemy 的构造函数,通常情况下,你就搞定了。而如果你想使用 多于一个的应用或是在函数中动态创建应用,你会想继续阅读本章。

如果你在一个函数中定义定义你的应用,而 SQLAlchemy 是全局的, 后者怎么得悉前者?答案是 init_app() 函数:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
    return app

它所做的是准备应用以与 SQLAlchemy 共同工作。可是这 现在不把 SQLAlchemy 绑定到你的应用。为什么不这么做? 因为那里可能创建不止一个应用。

那么 SQLAlchemy 如何获知你的应用?你会需要配置一个请求上下文。 如果你在一个 Flask 视图函数中进行工作,这会自动实现。但如果你在交互式 的 shell 中,你需要手动这么做。

(见 深入上下文局域变量 )。

简而言之,像这样做:

>>> from yourapp import create_app
>>> app = create_app()
>>> app.test_request_context().push()

在脚本中,使用 with 声明也同样有意义:

def my_function():
    with app():
        user = db.User(...)
        db.session.add(user)
        db.session.commit()

Flask-SQLAlchemy 里的一些函数也可以接受要操作的应用作为参数:

>>> from yourapp import db, create_app
>>> db.create_all(app=create_app())

Related Topics

This Page