python - Flask 和 SQLAlchemy 以及 MetaData 对象

标签 python sqlalchemy flask flask-sqlalchemy

这是我第一次使用这种环境。

我愿意使用的 SQLAlchemy 部分只是允许我使用具有 autoload = True 的 Table 对象查询数据库的部分。我这样做是因为我的表已经存在于数据库(mysql 服务器)中,并且不是通过定义 flask 模型创建的。

我已经浏览了所有文档,但似乎没有找到答案。这是一些代码:

app = Flask(__name__)
app.config.from_object(__name__)

metadata = None

def connect_db():
    engine = create_engine(app.config['DATABASE_URI'])
    global metadata
    metadata = MetaData(bind=engine)
    return engine.connect()


@app.before_request
def before_request():
    g.db = connect_db()


@app.teardown_request
def teardown_request(exception):
    g.db.close()

现在您可能想知道为什么我使用名为元数据的全局变量。好的,还有一些代码:

@app.route('/test/<int:id>')
def test(test_result_id):

    testTable = Table('test_table', metadata , autoload=True)

如您所见,我需要该对象是全局的,以便从函数内访问它。

此外,我在每个需要它的函数中声明了相同的 var testTable。我觉得这不是正确的方法。对于像我这样的案例,我找不到任何最佳实践建议。

谢谢大家!

最佳答案

你见过this snippet吗?在 SQLAlchemy 文档中?

也许这行得通:

# This is fine as a global global
metadata = MetaData()

@app.before_first_request
def autoload_tables():
    meta.reflect(bind=g.db.bind)

@app.route('/')
def index():
    users_table = meta.tables['users']

这样你的表在每个进程中只反射(reflect)一次,这可能是你想要的。请注意,您的引擎也应该是全局的,因此您无需在 @app.before_request 中创建新引擎 - 应用程序创建是更合适的地方。

如果您的情况非常特殊,您可能每个请求都需要一个引擎,在这种情况下您应该考虑 ThreadLocalMetaData类。

关于python - Flask 和 SQLAlchemy 以及 MetaData 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440610/

相关文章:

python - 在 Ubuntu 上使用 Python 的 Azure WebApp 中的连接泄漏

python - SQLAlchemy 自动加载插入记录

python - Flask、SAP UI5 和 MVC

python 使用 matplotlib 绘制 json 文件数据

python - 将 PyQt5 与 Tox(Python3.4 和 Python3.5)一起使用

python - 当我使用 "if string in list:"时是否可以在列表中获取索引?

python - 设置数据库的添加、删除和更改日志

python - 我怎样才能既注册蓝图又将该应用程序添加到 flask 管理员

python - 在数组 python/flask 中查找值

python - 我正在使用 unittest.TestCase 如果我有超过 1 个测试用例,它将不会运行。仅运行 1 个测试用例