Оновлення скриптів

Скрипт оновлення - це файл Python, що містить функцію під назвою migrate(), яку процес оновлення викликає під час оновлення модуля.

migrate(cr, version)
Параметри
  • cr (Cursor) – поточний курсор бази даних

  • version (str) – встановлена версія модуля

Зазвичай ця функція виконує один або кілька SQL-запитів, а також може отримувати доступ до ORM Odoo, а також до Утиліти оновлення.

Написання скриптів оновлення

Скрипти оновлення мають певну деревоподібну структуру з угодою про іменування, яка визначає, коли вони виконуються.

Структура шляху до скрипту оновлення є такою: $module/migrations/$version/pre,post,end-*.py, де $module - це модуль, для якого буде виконуватися скрипт, $version - повна версія модуля (включаючи основну версію Odoo та другорядну версію модуля), а {pre|post|end}-*.py - це файл, який потрібно виконати. Ім’я файлу визначатиме фазу та порядок, в якому він буде виконаний для цього модуля та версії.

Примітка

Починаючи з Odoo 13, каталог верхнього рівня для скриптів оновлення також може називатися upgrades. Таке найменування є кращим, оскільки воно має правильне значення: migrate можна сплутати з виходом з Odoo. Таким чином, $module/upgrades/$version/ також є дійсним.

Примітка

Скрипти оновлення виконуються тільки під час оновлення модуля. Тому версія модуля, встановлена в каталозі $version, повинна бути вищою за встановлену версію модуля і дорівнювати або бути нижчою за оновлену версію модуля.

Example

Структура каталогів скрипта оновлення для користувацького модуля з назвою awesome_partner, оновленого до версії 2.0 на Odoo 17.

awesome_partner/
|-- migrations/
|   |-- 17.0.2.0/
|   |   |-- pre-exclamation.py

Два приклади скриптів оновлення з вмістом файлу pre-exclamation.py, додаючи «!» в кінці імен партнерів:

import logging

_logger = logging.getLogger(__name__)


def migrate(cr, version):
    cr.execute("UPDATE res_partner SET name = name || '!'")
    _logger.info("Updated %s partners", cr.rowcount)
import logging
from odoo.upgrade import util

_logger = logging.getLogger(__name__)


def migrate(cr, version):
    env = util.env(cr)

    partners = env["res.partner"].search([])
    for partner in partners:
        partner.name += "!"

    _logger.info("Updated %s partners", len(partners))

Зверніть увагу, що у другому прикладі скрипт використовує Утиліти оновлення для доступу до ORM. Перегляньте документацію, щоб дізнатися більше про цю бібліотеку.

Фази скриптів оновлення

Процес оновлення складається з трьох етапів для кожної версії кожного модуля:

  1. Попередня фаза, перед завантаженням модуля.

  2. Попередня фаза, перед завантаженням модуля.

  3. Кінцева фаза, після того, як усі модулі були завантажені та оновлені для цієї версії.

Скрипти оновлення групуються відповідно до першої частини їхніх назв файлів у відповідні фази. У кожній фазі файли виконуються відповідно до їхнього лексичного порядку.

Порядок виконання прикладів скриптів для одного модуля в одній версії

  1. pre-10-do_something.py

  2. pre-20-something_else.py

  3. post-do_something.py

  4. post-something.py

  5. end-01-migrate.py

  6. end-migrate.py