一个数据库供两个应用使用:是复制模型还是导入模型?

为两个应用使用一个数据库:是复制模型还是导入模型?

当你在一个有一个后端但多个客户端的项目中工作时(例如一个网页应用 + 一个移动应用),你最终会面临这样的问题:

“我在我的 Flask 应用中已经有了 SQLAlchemy 模型。现在我正在为移动端构建一个 FastAPI 后端——我应该将模型复制到 FastAPI 项目中,还是从我的 Flask 项目中导入它们?”

这听起来像是一个小决定。
但它影响着你的整个项目架构、可维护性和数据库安全性。

让我们用简单的话来分析一下。

✅ 两个选项

选项 1 — 将模型文件复制到 FastAPI 应用中

只需将 Flask 项目中的 models.py 文件复制并粘贴到 FastAPI 文件夹中。

选项 2 — 直接从 Flask 应用中导入相同的模型

Your FastAPI app uses:

from flask_app.models import User, Vendor

因此这两个应用共享一个真实来源。

🔍 如果你复制模型会发生什么?

复制看起来很简单:

粘贴模型

进行一些修改

完成了吗?

并不完全。

❌ 1. 你将维护每个模型的两个版本

如果你在 Flask 中添加一个新列:

User.address = db.Column(…)

你还必须在 FastAPI 中手动添加它。

开发者会忘记。
然后两个应用开始认为数据库看起来不同。

问题就从这里开始。

❌ 2. 两个独立的迁移系统

Flask 使用 Flask-Migrate。
FastAPI 直接使用 Alembic。

如果你复制模型,你现在就有:

两个 Alembic 文件夹,

两个迁移历史,

两个运行迁移的地方。

一个错误?
不一致的模式 → 破损的 API。

3. 数据库不匹配的风险想象一下,Flask 认为:

name = String(100)

但 FastAPI 认为:

name = String(50)

或者一个应用程序添加了一个列,而另一个却不知道它的存在。

结果是什么?

  • 外键失败
  • 缺失列错误
  • 约束不匹配
  • 奇怪的错误,无法快速调试

❌ 4. 今天更多的工作 + 明天更繁重的工作

在开始时复制模型看起来很简单,但当你的项目增长时,你将遭受:

  • 重复的代码
  • 混乱
  • 额外的调试
  • 不可预测的错误

🌟 为什么导入模型是更好的解决方案

与其复制,你的 FastAPI 应用可以简单地加载相同的模型:

from flask_app.models import User, Vendor

这意味着:

✔ 只有一个版本的模型(没有重复)
✔ 只有一个迁移文件夹(没有冲突)
✔ 两个应用干净地使用相同的 Aiven 数据库
✔ 你在一个地方更新模型
✔ FastAPI 和 Flask 永远保持同步
✔ 没有意外或模式不匹配

这种方法更清晰、可扩展且易于维护。

🔧 如何实现这一点

这出乎意料地简单:

确保你的 Flask 项目结构像一个真正的 Python 包。

(如果有 init.py,实际上已经是了)

从 FastAPI 中将 Flask 项目添加到 Python 路径。

导入模型:

from vendora_app.models import User

使用相同的数据库连接(Aiven、PostgreSQL 等)。

现在你的 FastAPI 应用使用相同的模型、相同的表、相同的引擎——没有任何重复。

🎯 那么你应该怎么做?

如果你的项目会增长,如果你关心可维护性,或者如果多个开发者会参与其中:

始终导入模型。不要复制它们。

复制看起来很简单,但会造成长期的技术债务。

导入是干净、可扩展、专业的做法。

📝 结论

在构建多个共享同一数据库的应用时:

复制模型带来的问题远多于解决的问题。

导入模型可以保持一切一致,并具备未来适应性。

始终力求为你的数据库架构维护单一的真实来源。

你未来的自己(以及你的团队成员)会感谢你。

更多