Перенос данных

Перенос данных - это процесс сохранения правильных данных в базе данных после обновления до новой версии модуля. Например, простое переименование полей приводит к потере данных, если у вас нет соответствующих сценариев миграции данных.

Для * Миграции модулей * см . Porting Modules

Примечание

Module porting and data migration combined is usually called Database Upgrading in Odoo world

Подготовка

Эти миграции между версиями модуля.

От Odoo https://github.com/odoo/odoo/blob/11.0/odoo/modules/migration.py#L53:

Этот класс управляет миграцией модулей. Файлы миграции должны быть python-файлами, содержащими функцию `` migrate (cr, instal_version) ``. Эти файлы должны соответствовать структуре дерева каталогов: папка 'migrations', которая содержит папку по версии. Версия может быть версией 'module' или версией 'server.module' (в этом случае файлы будут обрабатываться только этой версией сервера). Имена файлов Python должны начинаться с * pre * или * post * и будут выполняться соответственно до и после инициализации модуля. Сценарии * end * запускаются после обновления всех модулей.

Пример:

<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
    |-- 9.0.1.1                             # processed only on a 9.0 server
    |   |-- pre-delete_table_z.py
    |   `-- post-clean-data.py
    `-- foo.py                              # not processed

выполнение

Миграционные файлы - это просто файлы кода, которые не нужно нигде регистрировать. При обновлении аддона Odoo выполняет поиск в * миграциях * папок с версией между ними, включая версию, для которой выполняется обновление. Это происходит до того, как все остальные файлы были обнаружены, поэтому в данный момент ничего не меняется в вашей структуре базы данных. Затем, если папки найдены, Odoo запускает файлы python с префиксом * pre- *. Они должны содержать определенную функцию с именем migrate. Эта функция имеет два аргумента: курсор базы данных и текущую установленную версию.

После того, как все функции перед миграцией были успешно выполнены, Odoo обновляет модуль. Теперь база данных может отличаться от предыдущей версии. Например, если в новой версии мы изменили тип поля модели, в базе данных этот столбец будет изменен без сохранения данных. Или, если поле было переименовано, в новой версии будет создан только новый столбец.

Затем, после обновления модуля, Odoo ищет файлы после переноса по тому же алгоритму и выполняет их.

Сценарии * end * запускаются после обновления всех модулей.

Предупреждение

Обновления миграции не отменяются, если некоторые ошибки произошли позже во время обновления модулей. Таким образом, вы всегда должны сначала пытаться обновить модуль с помощью скриптов миграции на копии.

пример

POS Debt & Credit notebook. We need to preserve credit_product field data in the product.template model after updating to a newer version. In previous version it was boolean field, now it is a many2one field with the relation to account.journal model. Here, we, using a temporary column, calculate transfer data from boolean to many2one credit_product field.

pre-migrate.py:

def migrate(cr, version):
    # Add temporary credit product column
    cr.execute('ALTER TABLE product_template ADD temporary_credit_product int')
    # Select debt journals
    cr.execute('SELECT id FROM account_journal WHERE account_journal.debt is true')
    # Take the first journal
    journal_id = cr.fetchone()
    if journal_id:
        # set token one to all credit products
        cr.execute('UPDATE product_template SET temporary_credit_product=%s WHERE credit_product is true', journal_id)

post-migrate.py:

def migrate(cr, version):
    # update new credit_product column with the tempory one
    cr.execute('UPDATE product_template SET credit_product=temporary_credit_product')
    # Drop temporary column
    cr.execute('ALTER TABLE product_template DROP COLUMN temporary_credit_product')