【问题标题】:Using the same database abstraction in Flask and non-Flask program在 Flask 和非 Flask 程序中使用相同的数据库抽象
【发布时间】:2026-01-28 16:15:01
【问题描述】:

基本上,我试图在 Flask 应用程序(用于 REST API)和 非 Flask API 之间共享尽可能多的数据库层代码。

在纯 Python API(旨在在非 Web Python 应用程序中导入)和 REST API Flask 守护程序中使用相同的 Flask-SQLAlchemy 层是否是个好主意?

我想换一种说法,虽然我不确定术语,“我如何最好地在 Flask 应用程序和单独的 Python 导入库之间共享数据库模型?”


或者从另一个角度来看,如果您还想与导入库共享 SQL 抽象,那么在 Flask REST API 中使用 Flask-SQLAlchemy 是否有任何意义。那么使用普通的SQLAlchemy会更好吗?

用例:我们有一个包含许多表的大型数据库,并且想要构建一个 REST API(用于客户访问)和一个 Python 导入库(用于高性能内部工具)来访问数据库,但当然共享尽可能多它们之间的代码尽可能。

相关:

【问题讨论】:

  • 您有三个选择:1.) 使用 Flask-SQLAlchemy 设置数据库层,并将 Flask 应用程序上下文用作库的一部分。 2.) 创建两个独立的代码库(Flask 和非 Flask)。 3.) 构建一个公共库,但使库的使用依赖于将 SQLAlchemy 会话传递给它(使用依赖注入之类的东西)。在您的 Flask 进程中,使用 Flask 应用程序上下文初始化库。否则,在您的其他程序中设置 SQLA 会话。您选择的这三种方法中的哪一种将非常适合您的环境,因此没有“正确”答案。
  • 我正在处理 3.) 但到目前为止找不到好的解决方案...*.com/questions/64320876/…
  • 我找到了一个不错的解决方案:*.com/a/64668814/7919597

标签: python sqlalchemy flask flask-sqlalchemy


【解决方案1】:

在 Web 上下文之外使用 Flask-SQLAlchemy 模型只是创建一个 Flask 应用程序并调用

app.test_request_context().push()

这里的重点是您将如何处理“非网络”库。 如果在需要使用库时安装整个 Flask 库没有问题,那么以这种方式使用它完全没有问题。

如果您计划在库数据访问代码中提高性能,例如使用不同的会话、并发等,那么您正在修改您的初始代码,因此这是一个完全不同的场景。在这种情况下,纯 SQLAlchemy 方法可能会更好,但这实际上取决于两种模式之间的差异。

模型通常带有方法,并且使用 2 种不同的 ORM 模式(Flask-SQLAlchemy 包装模型和纯 SQLAlchemy)意味着重复代码。

【讨论】: