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

2024-06-01 20:34:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

目前,我手动运行SQL脚本来将数据传输到新的列,并删除旧的列,但这很慢而且容易出错。在

有没有类似Liquibase for Java的?在

谢谢, 安东


Tags: 方法脚本名称数据库类型forsql手动
2条回答

只需使用-u选项运行openerp服务器:

python openerp-server.py -c <your config file> -u <your module>

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

作为这种同步的一部分,它支持简单的模式更改:只要列的名称和类型不变,ORM将尝试更新SQL约束(非NULL、UNIQUE、FOREIGN KEY等)和ONDELETE规则(如果有的话)。在

如果类型改变了,旧列将被重命名为“不在”的位置(但保留在周围以便您可以手动迁移数据),并将创建一个新的适当列。如果要迁移数据[*],则需要手动迁移操作。在

如果唯一更改的是列的名称,则可以使用oldnamecolumn属性向ORM提供一个提示。它告诉ORM需要重命名旧列,而不是创建新列。例如,如果缺少customer_id列,此列定义将使ORM尝试将partner_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。在

相关问题 更多 >