PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

mối quan hệ đã tồn tại sau khi thêm trường Many2many trong odoo

Tôi đã tìm ra điều này. Tôi phải nói rằng, về mặt kỹ thuật, điều này đủ điều kiện là một lỗi trong Odoo.

Tóm tắt

Tên các người mẫu của tôi quá dài. Mỗi khi bạn đặt _name thuộc tính dài hơn 16 ký tự mà bạn đang tự thiết lập có thể gặp sự cố này.

Chi tiết

Khi bạn tạo một Many2many quan hệ, odoo thiết lập một bảng cơ sở dữ liệu mới cho quan hệ này và sau đó tạo hai chỉ mục cơ sở dữ liệu cho bảng. Tên của họ như sau:

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

Ở đâu <model1><model2>_name tài sản của một mô hình thích hợp. Bạn có thể quan sát điều này trong _m2m_raise_or_create_relation phương thức của BaseModel của odoo .

Tuy nhiên, có một điều bắt được. Theo mặc định từ xác định trong PostgreSQL (bao gồm số nhận dạng chỉ mục) không được dài hơn 63 ký tự :

Odoo không tính đến điều này. Nó vui vẻ tạo ra các số nhận dạng dài hơn nhiều, sau đó được PostgreSQL cắt ngắn. Nếu cả hai số nhận dạng có cùng 63 ký tự đầu tiên (điều này rất có thể xảy ra đối với các số nhận dạng dài hơn) thì chúng sẽ được PostgreSQL coi là giống nhau. Điều đó có nghĩa là chỉ mục đầu tiên sẽ được tạo, nhưng việc tạo chỉ mục thứ hai sẽ dẫn đến lỗi, vì nó chia sẻ một số nhận dạng đã được sử dụng (ít nhất là theo PostgreSQL).

Vậy độ dài tối đa của _name là bao nhiêu tài sản có thể có trong khi tránh vấn đề? Nó phụ thuộc vào số lượng ký tự được chia sẻ giữa tên của hai mô hình trong mối quan hệ m2m, nhưng để tránh hoàn toàn việc cắt ngắn số nhận dạng, bạn không nên sử dụng tên dài hơn 16 ký tự.

Tại sao lại là 16? Số nhận dạng PostgreSQL không được dài hơn 63 ký tự. Trong định danh chỉ mục do odoo tạo ra, có 15 ký tự cố định. Điều đó để lại cho chúng tôi 48 ký tự, phải đáp ứng ba lần lặp lại tên mô hình. Điều này lần lượt để lại cho chúng ta 16 ký tự cho mỗi tên kiểu máy.

Một cách khác để giải quyết vấn đề là đặt tên quan hệ ngắn theo cách thủ công thông qua quan hệ relation thuộc tính trên Many2many trường.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LỖI:không thể truy cập tệp “$ libdir / plpython2” - LỖI:không thể truy cập tệp “$ libdir / plpython3”

  2. Postgresql 9.x:Chỉ mục để tối ưu hóa các truy vấn `xpath_exists` (XMLEXISTS)

  3. Đặt giới hạn mặc định cho pg_trgm

  4. postgresql với hàm quấn sql quá chậm?

  5. Cách Atan2d () hoạt động trong PostgreSQL