Nâng cấp Script¶
Tập lệnh nâng cấp là một tệp Python chứa hàm có tên migrate()
, mà quá trình nâng cấp gọi ra trong quá trình cập nhật mô-đun.
- migrate(cr, version)¶
- Tham số
cr (
Cursor
) -- con trỏ cơ sở dữ liệu hiện tạiversion (str) -- phiên bản đã cài đặt của mô-đun
Thông thường, hàm này thực thi một hoặc nhiều truy vấn SQL và cũng có thể truy cập ORM của SoOn, cũng như Nâng cấp tiện ích.
Viết Nâng cấp Script¶
Các tập lệnh nâng cấp tuân theo cấu trúc cây cụ thể với quy ước đặt tên xác định thời điểm chúng được thực thi.
Cấu trúc của đường dẫn tập lệnh nâng cấp là $module/migrations/$version/pre,post,end-*.py
, trong đó $module
là mô-đun mà tập lệnh sẽ chạy, $ version
là phiên bản đầy đủ của mô-đun (bao gồm phiên bản chính của SoOn và phiên bản phụ của mô-đun) và {pre|post|end}-*.py
là tệp cần được thực thi. Tên của tệp sẽ xác định phase và thứ tự thực thi nó cho mô-đun và phiên bản đó.
Ghi chú
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.
Ghi chú
Các tập lệnh nâng cấp chỉ được thực thi khi mô-đun đang được cập nhật. Do đó, phiên bản phụ của mô-đun được đặt trong thư mục $version
cần phải cao hơn phiên bản đã cài đặt của mô-đun và bằng hoặc thấp hơn phiên bản cập nhật của mô-đun.
Example
Cấu trúc thư mục của tập lệnh nâng cấp cho mô-đun tùy chỉnh có tên awesome_partner
được nâng cấp lên phiên bản 2.0
trên SoOn 17.
awesome_partner/
|-- migrations/
| |-- 17.0.2.0/
| | |-- pre-exclamation.py
Hai ví dụ về tập lệnh nâng cấp có nội dung là pre-exclaim.py
, tệp thêm "!" ở cuối tên của các đối tác:
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))
Lưu ý rằng trong ví dụ thứ hai, tập lệnh tận dụng Nâng cấp tiện ích để truy cập ORM. Kiểm tra tài liệu để tìm hiểu thêm về thư viện này.
Các giai đoạn của Nâng cấp Script¶
Quá trình nâng cấp bao gồm ba giai đoạn cho mỗi phiên bản của mỗi mô-đun:
Giai đoạn trước, trước khi mô-đun được tải.
Giai đoạn sau, sau khi mô-đun và các phần phụ thuộc của nó được tải và cập nhật.
Giai đoạn cuối, sau khi tất cả các mô-đun đã được tải và cập nhật cho phiên bản đó.
Các tập lệnh nâng cấp được nhóm theo phần đầu tiên của tên tệp vào giai đoạn tương ứng. Trong mỗi giai đoạn, các tệp được thực thi theo thứ tự từ vựng của chúng.
Thứ tự thực thi các tập lệnh mẫu cho một mô-đun trong một phiên bản
pre-10-do_something.py
pre-20-something_else.py
post-do_something.py
post-something.py
end-01-migrate.py
end-migrate.py