sql >> Databasteknik >  >> RDS >> PostgreSQL

relation existerar redan efter att ha lagt till ett Many2many-fält i odoo

Jag kom på det här. Jag måste säga att jag tror att detta tekniskt sett kvalificeras som en bugg i Odoo.

Sammanfattning

Namnen på mina modeller var för långa. Varje gång du anger ett _name egendom som är längre än 16 tecken som du ställer in för att eventuellt uppleva det här problemet.

Detaljer

När du skapar en Many2many relation, skapar odoo en ny databastabell för denna relation och skapar sedan två databasindex för tabellen. Deras namn är följande:

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

Där <model1> och <model2> är _name egenskap hos en lämplig modell. Du kan observera detta i _m2m_raise_or_create_relation metod för odoos BaseModel .

Det finns dock en hake. Som standard indetifierare i PostgreSQL (inklusive indexidentifierare) får inte vara längre än 63 tecken :

Odoo tar inte hänsyn till detta. Det genererar gärna mycket längre identifierare, som sedan trunkeras av PostgreSQL. Om båda identifierarna delar samma första 63 tecken (vilket för längre identifierare är ganska troligt) kommer de att behandlas av PostgreSQL som samma. Det betyder att det första indexet kommer att skapas, men att skapa det andra kommer att resultera i ett fel, eftersom det delar en identifierare som redan användes (åtminstone enligt PostgreSQL).

Så vad är den maximala längden på _name egendom kan ha samtidigt som man undviker problemet? Det beror på hur många tecken som delas mellan namnen på två modeller i m2m-relation, men för att helt undvika identifierare trunkering bör du aldrig använda namn som är längre än 16 tecken.

Varför 16? PostgreSQL-identifierare får inte vara längre än 63 tecken. I indexidentifierare som genereras av odoo finns det 15 fasta tecken. Det lämnar oss med 48 tecken, som måste rymma tre upprepningar av modellnamn. Detta ger oss i sin tur 16 tecken per enskilt modellnamn.

Ett annat sätt att kringgå problemet skulle vara att manuellt ställa in ett kort relationsnamn via relation attribut på Many2many fältet.



  1. SqlAlchemy Postgres JSON hur man filtrerar med frågeteckenoperator?

  2. Utropstecken i SQL (Oracle)

  3. PHP:mysql_connect returnerar inte FALSK

  4. Formatet för initialiseringssträngen överensstämmer inte med specifikationen som börjar vid index 0