如何使用sqlalchemy有效管理频繁的架构更改?

时间:2010-11-12 14:08:55

标签: python sqlalchemy pylons data-migration migrate

我正在使用sqlalchemy编写Web应用程序。在网站未投入生产的第一阶段开发期间,一切顺利。我可以通过简单地删除旧的sqlite数据库并从头创建一个新数据库来轻松更改数据库模式。

现在该网站已投入生产,我需要保留数据,但我仍希望通过轻松将数据库转换为新架构来保持原始开发速度。

因此,假设我在修订版50中有model.py,在model.py中有修订版75,描述了数据库的模式。在这两个模式之间,大多数更改都是微不足道的,例如,使用默认值声明新列,我只想将此默认值添加到旧记录中。

最终,一些变化可能并不简单,需要一些预先计算。

您是否(或将会)每天使用一个或两个新版本的生产代码来处理快速变化的Web应用程序?

顺便说一句,如果这有任何不同,该网站将以Pylons编写。

4 个答案:

答案 0 :(得分:36)

Alembic是一个新的数据库迁移工具,由SQLAlchemy的作者编写。我发现它比sqlalchemy-migrate更容易使用。它还可以与Flask-SQLAlchemy无缝协作。

从SQLAlchemy模型自动生成架构迁移脚本:

alembic revision --autogenerate -m "description of changes"

然后将新架构更改应用于您的数据库:

alembic upgrade head

此处有更多信息:http://readthedocs.org/docs/alembic/

答案 1 :(得分:14)

我们做什么。

  1. 使用“主要版本”。“次要版本”标识您的应用程序。主要版本是架构版本号。主要的数字是没有一些随机的“足够的新功能”的东西。这是与数据库模式兼容的正式声明。

    版本2.3和2.4都使用架构版本2.

    3.1版使用版本3架构。

  2. 使架构版本非常非常明显。对于SQLite,这意味着将架构版本号保留在数据库文件名中。对于MySQL,请使用数据库名称。

  3. 编写迁移脚本。 2to3.py,3to4.py。这些脚本分两个阶段工作。 (1)将旧数据查询到新结构中,创建简单的CSV或JSON文件。 (2)从简单的CSV或JSON文件加载新结构,无需进一步处理。这些提取文件 - 因为它们具有适当的结构,加载速度快,可以很容易地用作单元测试夹具。此外,您永远不会同时打开两个数据库。这使脚本稍微简单一些。最后,加载文件可用于将数据移动到另一个数据库服务器。

  4. “自动化”架构迁移非常非常困难。让数据库手术变得如此深刻,以至于自动脚本无法轻松地将数据从旧架构映射到新架构,这很容易(也很常见)。

答案 2 :(得分:13)

使用sqlalchemy-migrate

它旨在支持敏捷的数据库设计方法,并使得更容易使开发和生产数据库保持同步,因为需要更改架构。它使架构版本化变得容易。

将其视为数据库架构的版本控制。您将每个架构更改提交给它,它将能够在架构版本上前进/后退。这样您就可以升级客户端,它将确切地知道要在该客户端的数据库上应用哪组更改。

它自动为你做了S.Lott在他的回答中提出的建议。让事情变得简单。

答案 3 :(得分:1)

处理问题的最佳方法是反映您的架构,而不是以声明方式执行。我在这里写了一篇关于反思方法的文章: http://petrushev.wordpress.com/2010/06/16/reflective-approach-on-sqlalchemy-usage/ 但是还有其他资源。通过这种方式,每次更改模式时,只需重新启动应用程序,反射将获取表中更改的新元数据。这非常快,sqlalchemy每个过程只执行一次。当然,您必须管理自己制定的关系变化。