スクリプトをアップグレード¶
アップグレードスクリプトは migrate()
と呼ばれる関数を含むPythonファイルで、モジュールの更新中にアップグレードプロセスが呼び出されます。
通常、この関数は1つまたは複数のSQLクエリを実行し、 :doc:`./upgrade_utils`と同様にOdooのORMにアクセスすることもできます。
アップグレードスクリプトを書く¶
アップグレードスクリプトは、特定のツリー構造に従い、いつ実行されるかを決定する命名規則に従います。
The structure of an upgrade script path is $module/migrations/$version/pre,post,end-*.py
,
where $module
is the module for which the script will run, $version
is the full version of the
module (including Odoo's major version and the module's minor version) and {pre|post|end}-*.py
is
the file that needs to be executed. The file's name will determine the phase and order in which it is executed for that module and version.
注釈
Odoo 13 からアップグレードスクリプトの最上位ディレクトリに upgrades
という名前を付けることもできます。 この名前は正しい意味を持つため好まれます: 移行 は Odoo 外へ移動 することと混同されることがあります。 :file:`$module/upgrades/$version/`も有効です。
注釈
アップグレードスクリプトはモジュールが更新されているときにのみ実行されます。 そのため、 `$version`ディレクトリに設定されているモジュールのマイナーバージョンは、モジュールのインストールされているバージョンよりも高く、モジュールの更新されているバージョンと同等以下である必要があります。
Example
`awesome_partner`というカスタムモジュールのアップグレードスクリプトのディレクトリ構造は、Odoo 17のバージョン`2.0`にアップグレードされました。
awesome_partner/
|-- migrations/
| |-- 17.0.2.0/
| | |-- pre-exclamation.py
:file:`pre-exclamation.py`の内容を含む2つのアップグレードスクリプトの例, パートナーの名前の末尾に「!」を追加します:
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))
2つ目の例では、スクリプトは を利用していることに注意してください。 ORMにアクセスするには、upgrade_utils を参照してください。このライブラリについての詳細はドキュメントを参照してください。
アップグレードスクリプトの段階¶
アップグレードプロセスは、各モジュールのバージョンごとに3つのフェーズで構成されています。
モジュールがロードされる前のプリフェーズ。
モジュールとその依存関係がロードされ更新された後のフェーズ。
すべてのモジュールがロードされ、そのバージョンで更新された後のエンドフェーズ。
アップグレードスクリプトは、ファイル名の最初の部分に従って対応するフェーズにグループ化されます。 各フェーズ内で、ファイルはそれぞれのレキシカル順に応じて実行されます。
あるバージョンのモジュールのサンプルスクリプトの実行順序
pre-10-do_something.py
20-something_else.py
post-do_something.py
post-something.py
end-01-migrate.py
end-migrate.py