1

我在生产中有一个 postgres 生产数据库(其中包含大量数据)。现在我需要修改 tg-app 的模型以将几个新表添加到数据库中。

我该怎么做呢?我正在使用 sqlAlchemy。

4

4 回答 4

1

最简单的方法是简单地编写一些 sql 更新脚本并使用这些脚本来更新数据库。显然,这是一种相当低级(实际上)的方法。

如果你认为你会经常做这件事并想坚持使用 Python,你可能想看看sqlalchemy-migrate。在最近的 Python Magazine 中有一篇关于它的文章。

于 2008-11-19T12:10:43.607 回答
1

这总是有效的,不需要思考——只需要耐心。

  1. 做好备份。

  2. 实际做好备份。每个人都跳过第 1 步,以为他们有备份,但他们永远找不到它或使用它。不要相信任何您无法恢复的备份。

  3. 创建一个新的数据库模式。

  4. 在新模式中从头开始定义您的新结构。理想情况下,您将运行构建新模式的 DDL 脚本。没有构建架构的脚本?创建一个并将其置于版本控制之下。

    使用 SA,您可以定义表,它可以为您构建架构。这是理想的,因为您的模式在 Python 中处于版本控制之下。

  5. 移动数据。

    一种。对于未更改结构的表,使用简单的 INSERT/SELECT 语句将数据从旧模式移动到新模式。

    湾。对于确实改变结构的表,开发 INSERT/SELECT 脚本以将数据从旧数据移动到新数据。通常,这可以是每个新表的单个 SQL 语句。在某些情况下,它必须是具有两个开放连接的 Python 循环。

    C。对于新表,加载数据。

  6. 停止使用旧模式。开始使用新架构。找到每个使用旧模式的程序并修复配置。

    没有应用程序列表?做一个。说真的——这很重要。

    应用程序具有硬编码的数据库配置?修复它,也,当你在它的时候。要么创建一个公共配置文件,要么使用一些公共环境变量或其他东西来(a)确保一致性和(b)集中“生产”的概念。

您可以在任何时候进行大手术时进行这种手术。除了提取数据外,它从不接触旧数据库。

于 2008-11-19T12:10:50.923 回答
1

我大体上同意约翰的观点。单程 SELECTing 和 INSERTing 对于大型数据库不实用,设置复制或多程差异 SELECT / INSERT 可能更难且更容易出错。

就个人而言,我使用 SQLAlchemy 作为TurboGears下的 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 / SA 版本的版本)。

于 2008-12-24T00:30:18.340 回答
0

如果您只是添加表,而不是修改其中包含现有数据的任何表,您可以简单地将新的 sqlAlchemy 表定义添加到 model.py,然后运行:

tg-admin sql create

这不会覆盖您现有的任何表。

对于架构迁移,您可以查看http://code.google.com/p/sqlalchemy-migrate/虽然我自己还没有使用它。

始终在迁移活动之前备份生产数据库。

于 2008-11-19T12:10:19.223 回答