自动数据库重构与OpenERP中的重构python代码协调?

时间:2013-11-28 17:49:33

标签: python database refactoring openerp

当我重构Python类时(例如更改字段的名称/类型),在数据库中反映这些更改的最佳方法是什么?

目前,我手动运行SQL脚本以将数据传输到新列并修剪旧列,但这很慢并且容易出错。

像Liquibase for Java这样的东西?

谢谢, 安东

2 个答案:

答案 0 :(得分:2)

OpenERP ORM能够将数据库模式与模型的python定义同步,但它无法执行复杂的迁移操作。其目的是创建或更新支持最新版本模型所必需的数据库表和列,即允许插入,更新和读取记录。

作为此同步的一部分,它支持简单的架构更改:只要列的名称和类型不会更改,ORM将尝试更新SQL约束(NOT NULL,UNIQUE,FOREIGN KEY等) ,以及ONDELETE规则,如果有的话。

如果更改了类型,旧列将被重命名为不在路径中(但保留在原因以便您可以手动迁移数据),并将创建新的相应列。如果要迁移数据[*],则需要手动迁移操作。

如果唯一更改的是列的名称,则可以使用oldname列属性为ORM提供有关该名称的提示。它告诉ORM需要重命名旧列而不是创建新列。例如,如果partner_id列丢失,则此列定义会使ORM尝试将customer_id重命名为customer_id

'customer_id': fields.many2one('res.partner', 'Customer', oldname='partner_id'),

您可以通过使用`-u <module> -d <database>启动服务器或通过单击该数据库的“设置”菜单中相应模块的“更新”按钮来启动同步逻辑(--update是同义词-u,但请确保传递-d以使其直接在数据库上启动同步。)

请注意,在开发过程中不应使用oldname参数,只是尝试不同的数据库模式定义。此选项主要用于跟踪给定模块的主要版本之间的字段重命名。对于正在进行的开发,您不关心跟踪所有迭代,因此使用-u就足够了,您应该定期在新的空数据库上重新开始。


[*]在您的模块中嵌入您自己的迁移脚本的支持很少且几乎没有文档,ORM将根据检测到的模块版本自动执行它们。不幸的是,了解这项工作的最佳方式是阅读the source code

答案 1 :(得分:0)

只需使用-u选项运行openerp-server:

python openerp-server.py -c <your config file> -u <your module>
相关问题