使用Flask进行数据库迁移而不使用SQLAlchemy

6
有没有在Python中执行数据库迁移的库或工具,而不使用SQLAlchemy?我正在使用PostgreSQL数据库,查询是原始SQL。我使用psycopg2进行数据库连接。

psycopg2 是数据库连接 API,使用 psycopg2 您必须使用标准的 SQL 命令来操作数据库,然而 flask-SQLAlchemy 是围绕 SQLAlchemy 构建的 ORM 包装器,并为您提供了一个 Pythonic 接口到数据库,因此如果您想真正地使用 Python 管理数据库,您应该使用 SQLAlchemyflask-SQLAlchemy。Python 中实际的迁移库是 alembic,而 flask-migrate 是在 alembic 上构建的方便包装器。 - Rohit
1
你必须手动使用Alembic并运行迁移脚本。 - Rohit
1
alembic 为您生成迁移脚本,它隐藏了更新数据库中现有表的模式所需的巨大复杂性。对于具有大量列的表格,更新数据库中现有表的模式是非常复杂的操作,并且如果您经常需要执行此类操作,则会变得更加繁琐。 alembicflask-migrate 结合使用可以使这项任务变得非常容易。 - Rohit
1
如果您的应用程序使用纯SQL查询数据库,那么使用纯SQL编写迁移也是有意义的。创建一个表来跟踪已运行的迁移,并编写一个Python包装器来检查应该运行哪些迁移并实际运行这些迁移可能仍然是个好主意,但这似乎相当简单。迁移本身可以是裸的SQL文件。 - Zeust the Unoobian
1
@Zeust the Unoobian 这正是我最终所做的,效果很好。感谢您的建议。 - Yosry
显示剩余3条评论
3个回答

9

除了SQLAlchemy之外,Python中有几个用于版本控制数据库的迁移工具。 我无法针对其中任何一个进行评价,因此我寻找那些似乎被广泛采用并得到积极维护的工具。

(截至2023年4月14日)

工具 GitHub 星标 维护时间 备注
pgmigrate yandex/pgmigrate 562 2023年2月3日 仅适用于Postgres
dbmate amacneil/dbmate 3.3k 2023年3月
Yoyo coobas/yoyo-migrations 0 2020年3月
Migrate golang/migrate 11.2k 2023年4月 go语言库和CLI工具

我发现的其他资源似乎都与某个框架绑定在一起。在程序包索引中搜索会出现许多较旧的资源。

如果觉得pgmigrate或dbmate不可取,那么接下来是否值得问一下迁移工具是否真的需要特定于Python。通常,迁移是构建过程的一部分,(我认为)最好尽可能少地需要编码和配置。

Juan D.Vega的文章,Language and framework agnostic database migrations,强调了golang/migrate CLI工具,它试图提供一种管理迁移的方法,无论数据库支持的应用程序的详细信息如何。


2
Alembic是一个轻量级的数据库迁移工具,可与Python的SQLAlchemy数据库工具包一起使用。 - Abdur-Rahmaan Janhangeer
@Abdur-RahmaanJanhangeer 那么,Alembic可以在没有SQLAlchemy的情况下使用吗? - codingbruh
2
@codingbruh 不... - Abdur-Rahmaan Janhangeer
这是谷歌搜索的顶级结果,建议在回答StackOverflow问题时不要只是把人们指回谷歌。 - ParkerD

1
这个目的有一个叫做flask-migratepg的工具,它可以将SQL文件简单地放置在一个按字母数字顺序排列的database/migrations目录下,并使用flask migrate execute命令执行迁移。它基于Psycopg 3

0
如果你能够让自己在CLR之外进行数据库迁移,我强烈建议考虑使用FlyWay。它已经存在了很长时间,得到了RedGate的支持,并且社区版本是免费开源的。它内置了所有主要的数据库平台支持,并且安装方式与其他实用程序类似。对于Python应用程序,您需要通过shell脚本或进程调用来进行所有的数据库迁移,而不是直接在代码中进行。

我的团队选择这种技术,因为:

  1. Yoyo对我们来说比较不成熟和有bug
  2. 我们不使用SQLAlchemy的OR框架
  3. Alembic的语法和框架对我们来说似乎很笨重
  4. 在FlyWay的模型下,我们只需编写SQL脚本并将其检入到目录中。非常轻量级。
  5. 它已被证明在集群环境中运作良好

可以看一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接