PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

la relation existe déjà après l'ajout d'un champ Many2many dans odoo

J'ai compris cela. Je dois dire que je pense que cela est techniquement considéré comme un bogue dans Odoo.

Résumé

Les noms de mes modèles étaient trop longs. Chaque fois que vous définissez un _name propriété de plus de 16 caractères que vous configurez vous-même pour potentiellement rencontrer ce problème.

Détails

Lorsque vous créez un Many2many relation, odoo configure une nouvelle table de base de données pour cette relation, puis crée deux index de base de données pour la table. Leur nom est le suivant :

  • <model1>_<model2>_rel_<model1>_id_index
  • <model1>_<model2>_rel_<model2>_id_index

<model1> et <model2> sont les _name propriété d'un modèle approprié. Vous pouvez observer cela dans _m2m_raise_or_create_relation méthode du BaseModel d'odoo .

Il y a cependant un hic. Par défaut les indétificateurs dans PostgreSQL (y compris les identifiants d'index) ne peut pas dépasser 63 caractères :

Odoo n'en tient pas compte. Il génère heureusement des identifiants beaucoup plus longs, qui sont ensuite tronqués par PostgreSQL. Si les deux identifiants partagent les mêmes 63 premiers caractères (ce qui est assez probable pour les identifiants plus longs), ils seront traités par PostgreSQL comme identiques. Cela signifie que le premier index sera créé, mais la création du second entraînera une erreur, car il partage un identifiant qui a déjà été utilisé (au moins selon PostgreSQL).

Alors, quelle est la longueur maximale du _name propriété peut avoir tout en évitant le problème ? Cela dépend du nombre de caractères partagés entre les noms de deux modèles dans une relation m2m, mais pour éviter complètement la troncature de l'identifiant, vous ne devez jamais utiliser des noms de plus de 16 caractères.

Pourquoi 16 ? Les identifiants PostgreSQL ne peuvent pas dépasser 63 caractères. Dans les identifiants d'index générés par odoo, il y a 15 caractères fixes. Cela nous laisse avec 48 caractères, qui doivent accueillir trois répétitions de noms de modèles. Cela nous laisse à son tour 16 caractères par nom de modèle unique.

Une autre façon de contourner le problème serait de définir manuellement un nom de relation court via relation attribut sur le Many2many champ.