sql >> Database teknologi >  >> RDS >> PostgreSQL

relation eksisterer allerede efter tilføjelse af et Many2many-felt i odoo

Jeg fandt ud af det. Jeg må sige, jeg tror, ​​at dette teknisk set kvalificerer som en fejl i Odoo.

Oversigt

Navnene på mine modeller var for lange. Hver gang du angiver et _name egenskab længere end 16 tegn, du indstiller dig selv til potentielt at opleve dette problem.

Detaljer

Når du opretter en Many2many relation, opretter odoo en ny databasetabel for denne relation og opretter derefter to databaseindekser til tabellen. Deres navn er som følger:

  • ___rel__id_index
  • ___rel__id_index

Hvor og er _name egenskab af en passende model. Du kan observere dette i _m2m_raise_or_create_relation metode til odoo's BaseModel .

Der er dog én fangst. Som standard indetifiers i PostgreSQL (inklusive indeks-id'er) må ikke være længere end 63 tegn :

Odoo tager ikke højde for dette. Det genererer heldigvis meget længere identifikatorer, som derefter afkortes af PostgreSQL. Hvis begge identifikatorer deler de samme første 63 tegn (hvilket for længere identifikatorer er ret sandsynligt), vil de blive behandlet af PostgreSQL som det samme. Det betyder, at det første indeks vil blive oprettet, men at oprette det andet vil resultere i en fejl, da det deler en identifikator, der allerede blev brugt (i det mindste ifølge PostgreSQL).

Så hvad er den maksimale længde af _name ejendom kan have og samtidig undgå problemet? Det afhænger af, hvor mange tegn der deles mellem navnene på to modeller i m2m relation, men for fuldt ud at undgå identifikatorafkortning bør du aldrig bruge navne på mere end 16 tegn.

Hvorfor 16? PostgreSQL-id'er må ikke være længere end 63 tegn. I indeksidentifikatorer genereret af odoo er der 15 faste tegn. Det efterlader os med 48 tegn, som skal rumme tre gentagelser af modelnavne. Dette efterlader os igen med 16 tegn pr. enkelt modelnavn.

En anden måde at løse problemet på ville være manuelt at indstille et kort relationsnavn via relation attribut på Many2many felt.



  1. Indsæt unikke strenge med 8 tilfældige tegn

  2. Python MySQLdb / MySQL INSERT IGNORE &Checking if ignored

  3. hvordan man får den 3. rapport til at kombinere kunde- og ordredata

  4. hvordan får man positionsrangering af en bestemt række ved kun at bruge mysql-forespørgsel?