sql >> Databáze >  >> RDS >> PostgreSQL

vztah již existuje po přidání pole Many2many v odoo

Přišel jsem na to. Musím říct, že si myslím, že se to technicky kvalifikuje jako chyba v Odoo.

Shrnutí

Názvy mých modelů byly příliš dlouhé. Pokaždé, když nastavíte _name vlastnost delší než 16 znaků, kterou si nastavujete, aby se mohl tento problém vyskytnout.

Podrobnosti

Když vytvoříte Many2many vztahu, odoo nastaví pro tento vztah novou databázovou tabulku a poté pro tabulku vytvoří dva databázové indexy. Jejich název je následující:

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

Kde <model1> a <model2> jsou _name vlastnost vhodného modelu. Můžete to pozorovat v _m2m_raise_or_create_relation metoda BaseModel odeo .

Má to však jeden háček. Ve výchozím nastavení identifikátory v PostgreSQL (včetně indexových identifikátorů) nesmí být delší než 63 znaků :

Odoo to nebere v úvahu. Vesele generuje mnohem delší identifikátory, které pak PostgreSQL zkrátí. Pokud oba identifikátory sdílejí stejných prvních 63 znaků (což je u delších identifikátorů docela pravděpodobné), bude je PostgreSQL považovat za stejné. To znamená, že první index bude vytvořen, ale vytvoření druhého bude mít za následek chybu, protože sdílí identifikátor, který již byl použit (alespoň podle PostgreSQL).

Jaká je tedy maximální délka _name majetek může mít a zároveň se vyhnout problému? Záleží na tom, kolik znaků je sdíleno mezi názvy dvou modelů ve vztahu m2m, ale abyste se plně vyhnuli zkrácení identifikátoru, neměli byste nikdy používat názvy delší než 16 znaků.

Proč 16? Identifikátory PostgreSQL nemohou být delší než 63 znaků. V indexových identifikátorech generovaných odeo je 15 pevných znaků. Zbývá nám tedy 48 znaků, které musí pojmout tři opakování názvů modelů. To nám zase zbývá 16 znaků na jeden název modelu.

Dalším způsobem, jak problém vyřešit, je ručně nastavit krátký název vztahu pomocí relation atribut na Many2many pole.



  1. Příklady GETUTCDATE() v SQL Server (T-SQL)

  2. Chyba:Sloupec neexistuje

  3. sp_generate_inserts pro SQL Server 2008

  4. Kdy selže PREPARE QUERY v PRO C?