PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

relacja już istnieje po dodaniu pola Many2many w odoo

Rozgryzłem to. Muszę powiedzieć, że myślę, że technicznie kwalifikuje się to jako błąd w Odoo.

Podsumowanie

Nazwiska moich modeli były za długie. Za każdym razem, gdy ustawisz _name właściwość dłuższa niż 16 znaków, którą ustawiasz, aby potencjalnie napotkać ten problem.

Szczegóły

Kiedy tworzysz Many2many relacji, odoo tworzy nową tabelę bazy danych dla tej relacji, a następnie tworzy dwa indeksy bazy danych dla tej tabeli. Ich nazwa brzmi:

  • __rel__id_index
  • __rel__id_index

Gdzie i _name właściwość odpowiedniego modelu. Możesz to zaobserwować w _m2m_raise_or_create_relation metoda BaseModelu odoo .

Jest jednak jeden haczyk. Domyślnie indetifiers w PostgreSQL (w tym identyfikatory indeksu) nie może mieć więcej niż 63 znaki :

Odoo nie bierze tego pod uwagę. Z radością generuje znacznie dłuższe identyfikatory, które są następnie obcinane przez PostgreSQL. Jeśli oba identyfikatory mają te same pierwsze 63 znaki (co w przypadku dłuższych identyfikatorów jest całkiem prawdopodobne), zostaną one potraktowane przez PostgreSQL jako takie same. Oznacza to, że zostanie utworzony pierwszy indeks, ale utworzenie drugiego spowoduje błąd, ponieważ posiada on identyfikator, który był już używany (przynajmniej według PostgreSQL).

Więc jaka jest maksymalna długość _name nieruchomość może mieć unikając problemu? Zależy to od tego, ile znaków jest współdzielonych między nazwami dwóch modeli w relacji m2m, ale aby w pełni uniknąć obcięcia identyfikatora, nigdy nie należy używać nazw dłuższych niż 16 znaków.

Dlaczego 16? Identyfikatory PostgreSQL nie mogą być dłuższe niż 63 znaki. W identyfikatorach indeksów generowanych przez odoo znajduje się 15 stałych znaków. Pozostaje nam 48 znaków, które muszą pomieścić trzy powtórzenia nazw modeli. To z kolei pozostawia nam 16 znaków na jedną nazwę modelu.

Innym sposobem obejścia tego problemu byłoby ręczne ustawienie krótkiej nazwy relacji za pomocą relacji atrybut w Many2many pole.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy trzeba uruchomić REINDEX w postgresie

  2. użycie Array_append daje mi błąd składni podczas tworzenia funkcji PostgreSQL

  3. Wstaw wartość pola zakresu dat do tabeli PostgreSQL przez JDBC

  4. WYBIERZ ustaloną liczbę rzędów poprzez równomierne pomijanie rzędów

  5. Odejmij dwa zapytania z tej samej tabeli