62

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

现在该站点正在生产中,我需要保留数据,但我仍然希望通过轻松地将数据库转换为新模式来保持我原来的开发速度。

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

最终,一些更改可能不是微不足道的,并且需要一些预先计算。

您如何(或将)如何处理快速变化的 Web 应用程序,例如每天一到两个新版本的生产代码?

顺便说一句,如果这有什么不同的话,该站点是用 Pylons 编写的。

4

4 回答 4

43

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

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

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

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

alembic upgrade head

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

于 2012-11-20T05:32:09.453 回答
16

我们所做的。

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

    版本 2.3 和 2.4 都使用模式版本 2。

    版本 3.1 使用版本 3 架构。

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

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

“自动化”模式迁移非常非常困难。对数据库进行如此深入的操作很容易(并且很常见),以至于自动化脚本无法轻松地将数据从旧模式映射到新模式。

于 2010-11-12T14:14:32.477 回答
13

使用sqlalchemy-migrate

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

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

它会自动为您执行 S.Lott 在他的回答中提出的建议。让困难的事情变得容易。

于 2010-11-12T14:28:09.637 回答
0

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

于 2010-11-12T15:30:51.683 回答