我正在使用sqlalchemy编写Web应用程序。在网站未投入生产的第一阶段开发期间,一切顺利。我可以通过简单地删除旧的sqlite数据库并从头创建一个新数据库来轻松更改数据库模式。
现在该网站已投入生产,我需要保留数据,但我仍希望通过轻松将数据库转换为新架构来保持原始开发速度。
因此,假设我在修订版50中有model.py,在model.py中有修订版75,描述了数据库的模式。在这两个模式之间,大多数更改都是微不足道的,例如,使用默认值声明新列,我只想将此默认值添加到旧记录中。
最终,一些变化可能并不简单,需要一些预先计算。
您是否(或将会)每天使用一个或两个新版本的生产代码来处理快速变化的Web应用程序?
顺便说一句,如果这有任何不同,该网站将以Pylons编写。
答案 0 :(得分:36)
Alembic是一个新的数据库迁移工具,由SQLAlchemy的作者编写。我发现它比sqlalchemy-migrate更容易使用。它还可以与Flask-SQLAlchemy无缝协作。
从SQLAlchemy模型自动生成架构迁移脚本:
alembic revision --autogenerate -m "description of changes"
然后将新架构更改应用于您的数据库:
alembic upgrade head
答案 1 :(得分:14)
我们做什么。
使用“主要版本”。“次要版本”标识您的应用程序。主要版本是架构版本号。主要的数字是没有一些随机的“足够的新功能”的东西。这是与数据库模式兼容的正式声明。
版本2.3和2.4都使用架构版本2.
3.1版使用版本3架构。
使架构版本非常非常明显。对于SQLite,这意味着将架构版本号保留在数据库文件名中。对于MySQL,请使用数据库名称。
编写迁移脚本。 2to3.py,3to4.py。这些脚本分两个阶段工作。 (1)将旧数据查询到新结构中,创建简单的CSV或JSON文件。 (2)从简单的CSV或JSON文件加载新结构,无需进一步处理。这些提取文件 - 因为它们具有适当的结构,加载速度快,可以很容易地用作单元测试夹具。此外,您永远不会同时打开两个数据库。这使脚本稍微简单一些。最后,加载文件可用于将数据移动到另一个数据库服务器。
“自动化”架构迁移非常非常困难。让数据库手术变得如此深刻,以至于自动脚本无法轻松地将数据从旧架构映射到新架构,这很容易(也很常见)。
答案 2 :(得分:13)
它旨在支持敏捷的数据库设计方法,并使得更容易使开发和生产数据库保持同步,因为需要更改架构。它使架构版本化变得容易。
将其视为数据库架构的版本控制。您将每个架构更改提交给它,它将能够在架构版本上前进/后退。这样您就可以升级客户端,它将确切地知道要在该客户端的数据库上应用哪组更改。
它自动为你做了S.Lott在他的回答中提出的建议。让事情变得简单。
答案 3 :(得分:1)
处理问题的最佳方法是反映您的架构,而不是以声明方式执行。我在这里写了一篇关于反思方法的文章: http://petrushev.wordpress.com/2010/06/16/reflective-approach-on-sqlalchemy-usage/ 但是还有其他资源。通过这种方式,每次更改模式时,只需重新启动应用程序,反射将获取表中更改的新元数据。这非常快,sqlalchemy每个过程只执行一次。当然,您必须管理自己制定的关系变化。