PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

relação já existe depois de adicionar um campo Many2many no odoo


Eu percebi isso. Devo dizer que acho que isso tecnicamente se qualifica como um bug no Odoo.

Resumo

Os nomes dos meus modelos eram muito longos. Toda vez que você definir um _name propriedade com mais de 16 caracteres que você está configurando para potencialmente enfrentar esse problema.

Detalhes

Quando você cria um Many2many relação, odoo configura uma nova tabela de banco de dados para essa relação e, em seguida, cria dois índices de banco de dados para a tabela. Seus nomes são os seguintes:
  • <model1>_<model2>_rel_<model1>_id_index
  • <model1>_<model2>_rel_<model2>_id_index

Onde <model1> e <model2> são o _name propriedade de um modelo apropriado. Você pode observar isso em _m2m_raise_or_create_relation método do BaseModel do odoo .

No entanto, há uma captura. Por padrão identificadores no PostgreSQL (incluindo identificadores de índice) não pode ter mais de 63 caracteres :

Odoo não leva isso em consideração. Felizmente, ele gera identificadores muito mais longos, que são truncados pelo PostgreSQL. Se ambos os identificadores compartilharem os mesmos primeiros 63 caracteres (o que para identificadores mais longos é bastante provável), eles serão tratados pelo PostgreSQL como iguais. Isso significa que o primeiro índice será criado, mas criar o segundo resultará em erro, pois ele compartilha um identificador que já foi usado (pelo menos de acordo com o PostgreSQL).

Então, qual é o comprimento máximo do _name propriedade pode ter evitando o problema? Depende de quantos caracteres são compartilhados entre os nomes de dois modelos na relação m2m, mas para evitar totalmente o truncamento do identificador, você nunca deve usar nomes com mais de 16 caracteres.

Por que 16? Os identificadores do PostgreSQL não podem ter mais de 63 caracteres. Nos identificadores de índice gerados pelo odoo existem 15 caracteres fixos. Isso nos deixa com 48 caracteres, que precisam acomodar três repetições de nomes de modelos. Isso, por sua vez, nos deixa com 16 caracteres por nome de modelo único.

Outra maneira de contornar o problema seria definir manualmente um nome de relação curto por meio de relation atributo no Many2many campo.