Frissítési szkriptek

Egy frissítési szkript egy Python fájl, amely egy migrate() nevű függvényt tartalmaz, amelyet a frissítési folyamat meghív egy modul frissítése során.

migrate(cr, version)
Paraméterek
  • cr (Cursor) – aktuális adatbázis kurzor

  • version (str) – a modul telepített verziója

Általában ez a függvény egy vagy több SQL lekérdezést hajt végre, és hozzáférhet az Odoo ORM-hez, valamint a Frissítési segédprogramok-hoz is.

Frissítési szkriptek írása

A frissítési szkriptek egy meghatározott fa struktúrát követnek egy elnevezési konvencióval, amely meghatározza, mikor hajtódnak végre.

A frissítési szkript útvonalának struktúrája $module/migrations/$version/pre,post,end-*.py, ahol $module az a modul, amelyhez a szkript fut, $version a modul teljes verziója (beleértve az Odoo főverzióját és a modul kisebb verzióját), és {pre|post|end}-*.py az a fájl, amelyet végre kell hajtani. A fájl neve határozza meg a fázist és a sorrendet, amelyben végrehajtásra kerül az adott modul és verzió esetében.

Megjegyzés

From Odoo 13 the top-level directory for the upgrade scripts can also be named upgrades. This naming is preferred since it has the correct meaning: migrate can be confused with moving out of Odoo. Thus $module/upgrades/$version/ is also valid.

Megjegyzés

A frissítési szkriptek csak akkor hajtódnak végre, amikor a modult frissítik. Ezért a $version könyvtárban beállított modul kisebb verziójának magasabbnak kell lennie, mint a modul telepített verziója, és egyenlőnek vagy alacsonyabbnak kell lennie a modul frissített verziójával.

Example

Egy egyedi awesome_partner nevű modul frissítési szkriptjének könyvtárstruktúrája, amelyet az Odoo 17-en 2.0 verzióra frissítettek.

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

Two upgrade scripts examples with the content of the pre-exclamation.py, file adding „!” at the end of partners» names:

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))

Vegye figyelembe, hogy a második példában a szkript kihasználja a Frissítési segédprogramok előnyeit az ORM eléréséhez. Nézze meg a dokumentációt, hogy többet megtudjon erről a könyvtárról.

A frissítési szkriptek fázisai

A frissítési folyamat három fázisból áll minden modul minden verziója esetében:

  1. Az előfázis, mielőtt a modul betöltődik.

  2. A utófázis, miután a modul és annak függőségei betöltődtek és frissültek.

  3. A végfázis, miután az összes modul betöltődött és frissült az adott verzióhoz.

A frissítési szkriptek a fájlneveik első része alapján a megfelelő fázisba vannak csoportosítva. Minden fázison belül a fájlok lexikális sorrendben kerülnek végrehajtásra.

Példa szkriptek végrehajtási sorrendje egy modulhoz egy verzióban

  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