使用sqlalchemy-migrate值得吗?

51
我有一个使用sqlalchemy(在Pylons中)的Web应用程序。我需要有效地更改架构,以便每天至少可以更改生产版本,可能更多,而不会丢失数据。
我已经在周末玩了一下sqlalchemy-migrate,并且我认为它给了我一个不好的印象。首先,我认为它无法帮助在两个数据库引擎之间进行迁移;这可能只能通过sqlalchemy完成。其次,文档似乎不是最新的。我不得不更改一些命令行选项,比如在每个命令中提供存储库路径,这可能是migrate的一个错误。
但最糟糕的是“manage.py test”命令。它不仅实际上修改了数据库(这一点在文档中清楚地指出,所以我不能责怪migrate),而且我的第一个迁移脚本只是做了愚蠢的模式迁移,使升级/降级后的数据库与原始数据库具有不同的架构。但是,“manage.py test”只是回答了一些东西。
 success !

那就是说,它甚至没有检查模式是否保持一致的状态。 那么,使用迁移是否值得呢?与S.Lott建议的良好实践所提出的自己动手方法相比,有什么优势吗? 实际上,是否有简化迁移过程的sqlalchemy-migrate替代方案,或者我只是试图在先入为主的情况下使用migrate(然后请告诉我为什么它明显优于如上链接中提出的创建CSV列)? 非常感谢!
3个回答

80

请使用Alembic:

http://pypi.python.org/pypi/alembic

感谢评论,编辑后加入了一些理由--

Alembic是SQLAlchemy的作者开发的全新且得到良好支持的工具。我不太了解sqlalchemy-migrate,无法进行详细比较。但我很快浏览了清晰明了的Alembic文档,并在短时间内让自动生成的迁移文件正常运行。

自动生成:虽不是唯一操作模式,但如果选择,Alembic会读取您应用程序的SQLAlchemy配置(例如,声明性模型类设置所有表、约束和映射),并将其与数据库的实际当前状态进行比较,输出一个Python脚本来表示两者之间的差异。然后,您将该脚本传递给Alembic的升级命令,就完成差异处理了。通常需要手动编辑迁移脚本的少量内容,这是迁移的本质,而且为了确保在运行迁移之前充分了解迁移要执行的确切步骤,这也是您希望做的事情。

Alembic还为迁移跟踪带来了类似于DVCS的能力,这也使得返回到数据库模式的任何过去状态变得非常容易。


2
我第一次听说Alembic,所以查看了链接。哇,它是由Mike Bayer编写的——SQLAlchemy的作者!我一定会尝试它。 - Kenji Noguchi
如果您使用Flask,我建议您同时使用Flask-Migrate和Alembic,这将使一切变得更加容易。http://flask-migrate.readthedocs.org - fnkr
听从了您的建议并进行了切换,现在我有一个问题 - orome
唯一让 Alembic 完美的方法是强制执行特定的最佳实践,以便在创建数据库、选择引擎等方面遵循。除此之外,只需使用无 SQL 数据库即可。 - Patrick Mutuku

8
Alembic已经发布(http://pypi.python.org/pypi/alembic),由SQLAlchemy作者维护,考虑到sqlalchemy-migrate的开发似乎停滞不前,今年几乎没有提交记录(http://code.google.com/p/sqlalchemy-migrate/source/list),我认为不值得再使用它了。我将把我的当前项目转换到Alembic。
如果它仍然得到大力维护,我会对该项目与SQLAlchemy保持同步的能力有信心(这在以前是这样的)。

3
我个人非常喜欢使用它。它很棒,因为可以非常容易地引导新的安装(开发、测试、生产)。不仅如此,它还为应用程序提供了一个家,并为从应用程序的版本迁移时需要进行的这些迁移提供了良好的入口。在开发、测试和生产服务器上需要执行alter等操作。
它完美吗?不是的。你可能会让你的数据库处于糟糕的状态,但这就是为什么你需要开发/测试/生产版本的原因。
我个人使用它来引导我的Pylons单元测试,使用sqlite数据库运行单元测试,但我们在生产中使用mysql。因此,使用它有一些跨数据库平台的优势。

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