【问题标题】:Update database stored procedures while upgrading a module - Odoo升级模块时更新数据库存储过程 - Odoo
【发布时间】:2021-02-25 06:39:34
【问题描述】:

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。

【问题讨论】:

    标签: postgresql odoo


    【解决方案1】:

    在 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, SUPERUSER_ID, {}) # 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 这样的版本。你可以在__manifest__.py 中增加一个数字,就像12.0.1.2。稍后在您的migration 文件夹中添加一个新文件夹12.0.1.2。您可以在其中添加pre-post- python 文件。这将包括您的存储过程定义。另请注意,文件夹0.0.0 将始终运行。如果这不起作用,则可能是其他问题。 如果您遇到任何问题,请随时告诉我们。

    【讨论】:

    • 升级模块时无用,仅在模块安装时或刚安装后有效。但是升级模块时就不行了。
    • 如果您不介意,您能否向我们提供有关您尝试做什么的更多详细信息。你需要调用的方法到底是做什么的??
    • 我们使用存储过程来生成报表数据,所以当存储过程有细微的变化时,不卸载重新安装是没有办法的。这就是为什么我想在升级模块时更新存储过程。
    【解决方案2】:

    终于,我得到了解决方案。

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

    我们在__manifest__.py中添加了那个sql文件

    'data': [            
                'db_function/get_product_sales_history_data.sql',
                'db_function/update_product_sales_history.sql',
            ],
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多