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

asc*_*bol 52 python pylons data-migration sqlalchemy migrate

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

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

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

最终,一些变化可能不是微不足道的,需要一些预先计算.

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

顺便说一句,如果这有任何不同,该网站是用Pylons编写的.

Ala*_*ett 37

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

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

alembic revision --autogenerate -m "description of changes"
Run Code Online (Sandbox Code Playgroud)

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

alembic upgrade head
Run Code Online (Sandbox Code Playgroud)

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

  • 运行`alembic init alembic`并在alembic.ini中更改我的db用户名和密码后,我将我的alembic/env.py更改为:https://gist.github.com/alanhamlett/4721073这就是所需要的全部内容让alembic使用我的烧瓶应用程序.希望能帮助到你. (2认同)

S.L*_*ott 14

我们所做的.

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

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

    3.1版使用版本3架构.

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

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

"自动化"模式迁移非常非常困难.使数据库手术如此深刻以至于自动脚本无法轻松地将数据从旧模式映射到新模式,这很容易(也很常见).


nos*_*klo 13

使用sqlalchemy-migrate.

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

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

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