PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Beziehung existiert bereits, nachdem ein Many2many-Feld in Odoo hinzugefügt wurde

Ich habe das herausgefunden. Ich muss sagen, dass ich denke, dass dies technisch gesehen ein Fehler in Odoo ist.

Zusammenfassung

Die Namen meiner Modelle waren zu lang. Jedes Mal, wenn Sie einen _name festlegen Eigenschaft, die länger als 16 Zeichen ist, stellen Sie sich so ein, dass dieses Problem möglicherweise auftritt.

Einzelheiten

Wenn Sie ein Many2many erstellen Relation, richtet odoo eine neue Datenbanktabelle für diese Relation ein und erstellt dann zwei Datenbankindizes für die Tabelle. Ihre Namen lauten wie folgt:

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

Wobei <model1> und <model2> sind der _name Eigenschaft eines geeigneten Modells. Sie können dies in _m2m_raise_or_create_relation beobachten Methode von odoos BaseModel .

Es gibt jedoch einen Haken. Standardmäßig Bezeichner in PostgreSQL (einschließlich Indexbezeichner) darf nicht länger als 63 Zeichen sein :

Odoo berücksichtigt dies nicht. Es generiert gerne viel längere Bezeichner, die dann von PostgreSQL abgeschnitten werden. Wenn beide Bezeichner dieselben ersten 63 Zeichen haben (was bei längeren Bezeichnern sehr wahrscheinlich ist), werden sie von PostgreSQL als gleich behandelt. Das bedeutet, dass der erste Index erstellt wird, aber das Erstellen des zweiten führt zu einem Fehler, da er einen bereits verwendeten Bezeichner teilt (zumindest nach PostgreSQL).

Was ist also die maximale Länge von _name Eigentum haben kann, während das Problem vermieden wird? Es hängt davon ab, wie viele Zeichen sich die Namen zweier Modelle in der m2m-Beziehung teilen, aber um das Abschneiden von Identifikatoren vollständig zu vermeiden, sollten Sie niemals Namen verwenden, die länger als 16 Zeichen sind.

Warum 16? PostgreSQL-Identifikatoren dürfen nicht länger als 63 Zeichen sein. In von Odoo generierten Indexkennungen gibt es 15 feste Zeichen. Damit bleiben uns 48 Zeichen, die drei Wiederholungen von Modellnamen aufnehmen müssen. Dies wiederum lässt uns 16 Zeichen pro einzelnem Modellnamen.

Eine andere Möglichkeit, das Problem zu umgehen, besteht darin, manuell einen kurzen Beziehungsnamen über relation festzulegen -Attribut auf Many2many Feld.