为两个应用使用一个数据库:是复制模型还是导入模型?
当你在一个有一个后端但多个客户端的项目中工作时(例如一个网页应用 + 一个移动应用),你最终会面临这样的问题:
“我在我的 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 应用使用相同的模型、相同的表、相同的引擎——没有任何重复。
🎯 那么你应该怎么做?
如果你的项目会增长,如果你关心可维护性,或者如果多个开发者会参与其中:
始终导入模型。不要复制它们。
复制看起来很简单,但会造成长期的技术债务。
导入是干净、可扩展、专业的做法。
📝 结论
在构建多个共享同一数据库的应用时:
复制模型带来的问题远多于解决的问题。
导入模型可以保持一切一致,并具备未来适应性。
始终力求为你的数据库架构维护单一的真实来源。
你未来的自己(以及你的团队成员)会感谢你。

