PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

relasi sudah ada setelah menambahkan bidang Many2many di odoo

Saya menemukan ini. Saya harus mengatakan, saya pikir ini secara teknis memenuhi syarat sebagai bug di Odoo.

Ringkasan

Nama-nama model saya terlalu panjang. Setiap kali Anda menetapkan _name properti yang panjangnya lebih dari 16 karakter yang Anda atur sendiri berpotensi mengalami masalah ini.

Detail

Saat Anda membuat Many2many relasi, odoo menyiapkan tabel database baru untuk relasi ini dan kemudian membuat dua indeks database untuk tabel tersebut. Nama mereka adalah sebagai berikut:

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

Dimana <model1> dan <model2> adalah _name properti dari model yang sesuai. Anda dapat mengamati ini di _m2m_raise_or_create_relation metode BaseModel odoo's .

Namun ada satu tangkapan. Secara default pengidentifikasi di PostgreSQL (termasuk pengidentifikasi indeks) tidak boleh lebih dari 63 karakter :

Odoo tidak memperhitungkan hal ini. Ini dengan senang hati menghasilkan pengidentifikasi yang lebih panjang, yang kemudian dipotong oleh PostgreSQL. Jika kedua pengidentifikasi memiliki 63 karakter pertama yang sama (yang kemungkinan besar untuk pengidentifikasi yang lebih panjang) mereka akan diperlakukan oleh PostgreSQL sebagai hal yang sama. Itu berarti indeks pertama akan dibuat, tetapi membuat indeks kedua akan menghasilkan kesalahan, karena indeks tersebut berbagi pengenal yang sudah digunakan (setidaknya menurut PostgreSQL).

Jadi berapa panjang maksimum _name properti dapat memiliki sambil menghindari masalah? Itu tergantung pada berapa banyak karakter yang dibagi antara nama dua model dalam relasi m2m, tetapi untuk sepenuhnya menghindari pemotongan pengidentifikasi, Anda tidak boleh menggunakan nama yang lebih panjang dari 16 karakter.

Mengapa 16? Pengenal PostgreSQL tidak boleh lebih dari 63 karakter. Dalam pengidentifikasi indeks yang dihasilkan oleh odoo ada 15 karakter tetap. Itu membuat kita memiliki 48 karakter, yang harus mengakomodasi tiga pengulangan nama model. Ini pada gilirannya membuat kami memiliki 16 karakter per nama model tunggal.

Cara lain untuk mengatasi masalah ini adalah dengan menetapkan nama relasi pendek secara manual melalui relation atribut pada Many2many lapangan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy create_all() tidak membuat tabel

  2. kebuntuan postgres tanpa penguncian eksplisit

  3. Kekurangan tabel dengan terlalu banyak kolom

  4. Bagaimana cara mengembalikan hanya waktu kerja dari reservasi di PostgreSql?

  5. Kesalahan saat mencoba menginstal Django-toolkit di dalam python virtualenv