odoo/upgrade-util#348

Created by Upgrade, Edoardo Piroli (pied)

Blocked

label
odoo-dev:master-adapt_to_pg18_notnull_constraint_names-pied
head
f554ef1c8fb178f419047102134cc305dd87c001
odoo/upgrade-util
master #348 missing r+

[FIX] pg: avoid dropping not null constraints in pg18

In PG18 not null constraint names follow the '{table}{column}_not_null' pattern as opposed to the '[0-9]+_not_null' one followed until pg17.

Our utils must be adapted to cope with that, otherwise the util will attempt to drop not null constraints - failing against those of primary keys.

The following traceback is achieved when trying to upgrade a new demo db in PG18 with mrp installed, from 17.0 to 18.0:

2025-11-04 10:23:38,126 28873 ERROR test_mrp_17_18.0 odoo.sql_db: bad query: b'ALTER TABLE "mail_push" DROP CONSTRAINT IF EXISTS "mail_notification_web_push_id_not_null" '
ERROR: column "id" is in a primary key

2025-11-04 10:23:38,127 28873 WARNING test_mrp_17_18.0 odoo.modules.loading: Transient module states were reset
2025-11-04 10:23:38,129 28873 ERROR test_mrp_17_18.0 odoo.modules.registry: Failed to load registry
2025-11-04 10:23:38,129 28873 CRITICAL test_mrp_17_18.0 odoo.service.server: Failed to initialize database `test_mrp_17_18.0`.
Traceback (most recent call last):
  File "/home/odoo/src/odoo/18.0/odoo/service/server.py", line 1366, in preload_registries
    registry = Registry.new(dbname, update_module=update_module)
  File "<decorator-gen-13>", line 2, in new
  File "/home/odoo/src/odoo/18.0/odoo/tools/func.py", line 97, in locked
    return func(inst, *args, **kwargs)
  File "/home/odoo/src/odoo/18.0/odoo/modules/registry.py", line 129, in new
    odoo.modules.load_modules(registry, force_demo, status, update_module)
  File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 485, in load_modules
    processed_modules += load_marked_modules(env, graph,
  File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 365, in load_marked_modules
    loaded, processed = load_module_graph(
  File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 182, in load_module_graph
    migrations.migrate_module(package, 'pre')
  File "/home/odoo/src/odoo/18.0/odoo/modules/migration.py", line 222, in migrate_module
    exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
  File "/home/odoo/src/odoo/18.0/odoo/modules/migration.py", line 259, in exec_script
    mod.migrate(cr, installed_version)
  File "/home/odoo/src/upgrade/migrations/mail/saas~17.1.1.16/pre-migrate.py", line 30, in migrate
    util.rename_model(cr, "mail.notification.web.push", "mail.push")
  File "/home/odoo/src/upgrade-util/src/util/models.py", line 308, in rename_model
    pg_rename_table(cr, old_table, new_table)
  File "/home/odoo/src/upgrade-util/src/util/pg.py", line 1354, in rename_table
    remove_constraint(cr, new_table, const, warn=False)
  File "/home/odoo/src/upgrade-util/src/util/pg.py", line 853, in remove_constraint
    cr.execute(format_query(cr, "ALTER TABLE {} DROP CONSTRAINT IF EXISTS {} {}", table, name, cascade))
  File "/home/odoo/src/odoo/18.0/odoo/sql_db.py", line 357, in execute
    res = self._obj.execute(query, params)
psycopg2.errors.InvalidTableDefinition: column "id" is in a primary key