使用sqlalchemy-migrate值得吗?
我有一个使用sqlalchemy(在Pylons框架下)的网页应用程序。我需要高效地更改数据库结构,这样我就可以至少每天,甚至更多次地更新生产版本,而不会丢失数据。
我在周末尝试了一下sqlalchemy-migrate,感觉不是很好。首先,我觉得它无法帮助在两个不同的数据库引擎之间迁移; 这可能只需要用sqlalchemy就能做到。其次,文档似乎没有更新。我不得不在每个命令中都指定仓库路径,这可能是migrate的一个bug。
但最糟糕的是“manage.py test”这个命令。它不仅会修改数据库(这一点在文档中有明确说明,所以我不能怪migrate),而且我第一个迁移脚本只是做了一些简单的结构迁移,导致升级和降级后的数据库与原来的结构不同。而“manage.py test”只是回答了类似这样的内容:
success !
也就是说,它甚至没有检查结构是否保持一致。所以使用migrate值得吗?与S.Lott提出的结合良好实践的“自己动手”方法相比,有什么优势吗?有没有其他的工具可以简化迁移过程,还是我只是用错误的方式在尝试使用migrate(如果是这样,请告诉我为什么它明显优于上面链接中提到的创建CSV列的方法)?
非常感谢!
3 个回答
我个人非常喜欢使用这个工具。它真是太棒了,因为新安装(开发、测试、生产)可以非常轻松地启动。不仅如此,它还为应用程序的成长提供了一个家,并且在你从一个版本迁移到另一个版本时,提供了很好的入口点来处理那些必要的迁移。总之,必须有一些东西来在开发、测试和生产服务器上执行修改等操作。
它完美吗?当然不是。你可能会让数据库处于一个糟糕的状态,但这就是为什么你需要开发、测试和生产版本的原因。
就我个人而言,我用它来在pylons中启动我的单元测试,使用sqlite数据库来运行单元测试,但我们在生产环境中使用的是mysql。所以使用它有一些跨数据库平台的优势。
Alembic已经发布了(http://pypi.python.org/pypi/alembic),而且是由SQLAlchemy的作者维护的。考虑到sqlalchemy-migrate这个项目的发展似乎停滞不前,今年几乎没有更新(http://code.google.com/p/sqlalchemy-migrate/source/list),我觉得不值得再使用它了,我会把我现在的项目切换到Alembic。
如果它还在积极维护的话,我会对这个项目能跟上SQLAlchemy的更新感到很有信心(之前就是这样的情况)。
使用Alembic更好:
http://pypi.python.org/pypi/alembic
感谢大家的评论,我编辑了一下,增加了一些理由 --
Alembic是SQLAlchemy的作者开发的,它是全新的,并且得到了很好的支持。我对sqlalchemy-migrate了解不多,所以没法做出好的比较。不过我快速浏览了一下Alembic的文档,内容清晰简洁,然后很快就让自己的自动生成迁移工作起来了。
自动生成:这不是它唯一的工作模式,但如果你选择,Alembic会读取你应用的sqlalchemy配置(比如,你的声明模型类,这些类设置了所有的表、约束和映射),然后和你数据库的当前状态进行比较,输出一个Python脚本,表示两者之间的差异。接着你把这个脚本传给Alembic的升级命令,就完成了,差异就解决了。通常需要手动编辑一下迁移脚本,这(a)是迁移的本质,和(b)也是你想做的事情,因为这样可以确保你完全了解迁移将要执行的具体步骤,然后再运行它。
Alembic还为你的迁移跟踪带来了类似DVCS(分布式版本控制系统)的能力。它让你很容易返回到数据库模式的任何过去状态。