升级模块时更新数据库存储过程 - Odoo

问题描述

menifest 文件中有一个选项可以在模块安装过程中调用方法。我们可以提到 pre_initpost_init

我想在升级模块时调用一种方法,类似于 pre_init。因为安装模块后,pre_init 不会被调用

对此有什么建议吗?

为什么我需要这个......

我有一个使用 postgresql 存储过程的存储过程来快速生成报告数据,现在当过程中有细微的变化时,我想在模块升级过程中更新它。

升级模块期间应该有一些选项可用于调用方法,例如pre_initpost_init

我尝试了以下方法来做到这一点。

# Added following code in XML file
<function model="sale.order" name="action_custom_method"/>

@api.model
def action_custom_method(self):
    # stored procedure code
    return True

但这对我不起作用,我正在使用 odoo 14。

解决方法

在 Odoo 14 中,它变成了 pre_init_hookpost_init_hook。这将在 __manifest__.py

中设置
{
    'pre_init_hook': pre_init_hook_method,'post_init_hook': post_init_hook_method,}

您还在 __init__.py 中添加方法定义

def pre_init_hook_method(cr):
    env = api.Environment(cr,SUPERUSER_ID,{}) # to get env

def post_init_hook_method(cr,registry):
    env = api.Environment(cr,{}) # to get env

您也可以使用 migrations 文件夹和模块版本控制,就像那里提到的那样 Data Migration

所以在你的模块文件夹中你会有一个 migration 文件夹。如下结构:

<moduledir>
`-- migrations
        |-- 1.0
        |   |-- pre-update_table_x.py
        |   |-- pre-update_table_y.py
        |   |-- post-create_plop_records.py
        |   |-- end-cleanup.py
        |   `-- README.txt                      # not processed
        |-- 12.0.1.1                            # processed only on a 12.0 server
        |   |-- pre-delete_table_z.py
        |   `-- post-clean-data.py
        |-- 0.0.0
        |   `-- end-invariants.py               # processed on all version update

因此,如果您的模块之前使用 12.0.1.1 之类的版本定义。您可以增加一个数字,使其类似于 12.0.1.2 中的 __manifest__.py。稍后在您的 migration 文件夹中添加一个新文件夹 12.0.1.2。您可以在其中添加 pre-post- python 文件。这将包括您的存储过程定义。另请注意,文件夹 0.0.0 将始终运行。如果那不起作用,那可能是其他问题。 如果您遇到任何问题,请随时告诉我们。

,

最后,我得到了解决方案。

我们创建了一个 .sql 文件,并将所有存储过程和其他数据库对象添加到该文件中。

我们在 __manifest__.py

中添加了那个 sql 文件
'data': [            
            'db_function/get_product_sales_history_data.sql','db_function/update_product_sales_history.sql',],

它会在模块安装时以及模块升级时执行这些sql文件。