如何更新Turbogears应用程序的生产数据库
我现在有一个在生产环境中的Postgres数据库,这个数据库里存了很多数据。现在我需要修改tg-app的模型,往数据库里添加几个新表。
我该怎么做呢?我正在使用sqlAlchemy。
4 个回答
我大致同意约翰
就我个人而言,我在TurboGears下使用SQLAlchemy作为对象关系映射工具(ORM)。为了进行数据库结构的迁移,我会运行:
tg-admin sql status
这样可以查看当前数据库和开发数据库结构之间的差异,然后手动编写(并进行版本控制)DDL脚本来进行所需的更改。
对于那些单独使用SQLAlchemy的人(也就是说,不在TurboGears下使用),sql status
功能非常简单,可以在TG的源代码中找到,链接是:http://svn.turbogears.org/branches/1.1/turbogears/command/sacommand.py(在1.0分支中也有适用于旧版Python和SQLAlchemy的版本)。
最简单的方法就是写一些 SQL 更新脚本,用它们来更新数据库。显然,这是一种比较基础的方法。
如果你觉得以后会经常这样做,并且想继续使用 Python,可以考虑看看 sqlalchemy-migrate。最近的《Python Magazine》上有一篇关于它的文章。
这个方法总是有效,而且只需要一点耐心,不需要太多思考。
先备份。
真的要备份。很多人都跳过这一步,以为自己已经备份了,但实际上找不到或者用不了。不要相信那些你无法恢复的备份。
创建一个新的数据库结构。
从头开始在新的结构中定义你的新内容。理想情况下,你应该运行一个DDL脚本来构建新的结构。如果没有这样的脚本,赶紧创建一个,并把它放到版本控制里。
使用SA(系统架构),你可以定义你的表格,它会为你构建结构。这是最理想的,因为你可以在Python中对你的结构进行版本控制。
迁移数据。
a. 对于结构没有变化的表格,使用简单的INSERT/SELECT语句将数据从旧结构迁移到新结构。
b. 对于结构有变化的表格,开发INSERT/SELECT脚本,将数据从旧表迁移到新表。通常,这可以是每个新表一个SQL语句。在某些情况下,可能需要用Python循环和两个打开的连接。
c. 对于新表,加载数据。
停止使用旧结构。开始使用新结构。找到所有使用旧结构的程序,并修复它们的配置。
没有应用程序的清单?那就做一个。真的,这很重要。
应用程序有硬编码的数据库配置?那也要修复。可以创建一个公共配置文件,或者使用一些公共环境变量,来确保一致性,并集中管理“生产环境”的概念。
每当你进行重大修改时,都可以按照这个流程来操作。这个过程不会影响旧数据库,除了提取数据。