Перенос данных¶
Перенос данных - это процесс сохранения правильных данных в базе данных после обновления до новой версии модуля. Например, простое переименование полей приводит к потере данных, если у вас нет соответствующих сценариев миграции данных.
Для * Миграции модулей * см . 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')