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

la relazione esiste già dopo aver aggiunto un campo Many2many in odoo

Ho capito questo. Devo dire che penso che tecnicamente si qualifichi come un bug in Odoo.

Riepilogo

I nomi dei miei modelli erano troppo lunghi. Ogni volta che imposti un _name proprietà più lunga di 16 caratteri che stai configurando per riscontrare potenzialmente questo problema.

Dettagli

Quando crei un Many2many relazione, odoo imposta una nuova tabella di database per questa relazione e quindi crea due indici di database per la tabella. Il loro nome è il seguente:

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

Dove <model1> e <model2> sono il _name proprietà di un modello appropriato. Puoi osservarlo in _m2m_raise_or_create_relation metodo del BaseModel di odoo .

C'è però un problema. Di default indetifiers in PostgreSQL (inclusi gli identificatori di indice) non può essere più lungo di 63 caratteri :

Odoo non ne tiene conto. Genera felicemente identificatori molto più lunghi, che vengono poi troncati da PostgreSQL. Se entrambi gli identificatori condividono gli stessi primi 63 caratteri (cosa molto probabile per identificatori più lunghi) verranno trattati da PostgreSQL come gli stessi. Ciò significa che verrà creato il primo indice, ma la creazione del secondo risulterà in un errore, poiché condivide un identificatore già utilizzato (almeno secondo PostgreSQL).

Quindi qual è la lunghezza massima del _name la proprietà può avere evitando il problema? Dipende da quanti caratteri sono condivisi tra i nomi di due modelli in relazione m2m, ma per evitare completamente il troncamento dell'identificatore non dovresti mai usare nomi più lunghi di 16 caratteri.

Perché 16? Gli identificatori PostgreSQL non possono essere più lunghi di 63 caratteri. Negli identificatori di indice generati da odoo ci sono 15 caratteri fissi. Questo ci lascia con 48 caratteri, che devono contenere tre ripetizioni dei nomi dei modelli. Questo a sua volta ci lascia con 16 caratteri per il nome del singolo modello.

Un altro modo per aggirare il problema sarebbe impostare manualmente un nome di relazione breve tramite relation attributo su Many2many campo.