我正在制作一个postgres生产数据库(包含大量数据)。现在我需要修改tg-app的模型,将几个新表添加到数据库中。
我该怎么做?我正在使用sqlAlchemy。
答案 0 :(得分:1)
最简单的方法是简单地编写一些sql更新脚本并使用它们来更新数据库。显然,这是一种相当低级(原样)的方法。
如果您认为自己会这么做并希望坚持使用Python,那么您可能需要查看sqlalchemy-migrate。在最近的Python杂志中有一篇关于它的文章。
答案 1 :(得分:1)
这总是有效的,只需要很少的思考 - 只有耐心。
进行备份。
实际上做一个备份。每个人都跳过第1步,认为他们有备份,但他们永远无法找到它或使用它。不要相信任何无法恢复的备份。
创建新的数据库架构。
在新架构中从头开始定义新结构。理想情况下,您将运行构建新架构的DDL脚本。没有脚本来构建架构?创建一个并将其置于版本控制之下。
使用SA,您可以定义表格,它可以为您构建架构。这是理想的,因为您的模式控制在Python中。
移动数据。
一个。对于未更改结构的表,使用简单的INSERT / SELECT语句将数据从旧模式移动到新模式。
湾对于确实更改结构的表,开发INSERT / SELECT脚本以将数据从旧移动到新。通常,这可以是每个新表的单个SQL语句。在某些情况下,它必须是一个带有两个开放连接的Python循环。
℃。对于新表,请加载数据。
停止使用旧架构。开始使用新架构。查找使用旧架构的每个程序并修复配置。
没有应用程序列表?做一个。说真的 - 这很重要。
应用程序是否具有硬编码数据库配置?当你在它时,也要修复它。创建一个公共配置文件,或使用一些常见的环境变量或某些东西来(a)确保一致性和(b)集中“生产”的概念。
您可以在进行大手术时进行此类手术。除了提取数据外,它永远不会触及旧数据库。
答案 2 :(得分:1)
我一般同意John。单通道SELECT和INSERT对大型数据库不实用,设置复制或多通道差分SELECT / INSERT可能会更难,更容易出错。
就个人而言,我在TurboGears下使用SQLAlchemy作为ORM。要执行架构迁移,我运行:
tg-admin sql status
要查看实时和开发模式之间的区别,请手动编写(和版本控制)DDL脚本以进行必要的更改。
对于那些使用SQLAlchemy独立版(即不在TurboGears下)的人来说,sql status
功能非常简单,可以在TG源代码中找到:http://svn.turbogears.org/branches/1.1/turbogears/command/sacommand.py(有旧版Python / SA版本的版本) 1.0分支也是如此。
答案 3 :(得分:0)
如果您只是添加表,而不修改其中包含现有数据的任何表,则只需将新的sqlAlchemy表定义添加到model.py,然后运行:
tg-admin sql create
这不会覆盖任何现有表格。
对于架构迁移,您可能会看一下http://code.google.com/p/sqlalchemy-migrate/,尽管我自己还没有使用它。
始终在迁移活动之前备份生产数据库。