当我重构Python类时(例如更改字段的名称/类型),在数据库中反映这些更改的最佳方法是什么?
目前,我手动运行SQL脚本以将数据传输到新列并修剪旧列,但这很慢并且容易出错。
像Liquibase for Java这样的东西?
谢谢, 安东
答案 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>