PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

ओडू में कई 2 कई फ़ील्ड जोड़ने के बाद संबंध पहले से मौजूद है

मैंने यह पता लगा लिया। मुझे कहना होगा, मुझे लगता है कि यह तकनीकी रूप से ओडू में एक बग के रूप में योग्य है।

सारांश

मेरे मॉडलों के नाम बहुत लंबे थे। हर बार जब आप _name . सेट करते हैं संभावित रूप से इस समस्या का अनुभव करने के लिए 16 वर्णों से अधिक लंबी संपत्ति जिसे आप स्वयं सेट कर रहे हैं।

विवरण

जब आप एक Many2many बनाते हैं संबंध, ओडू इस संबंध के लिए एक नई डेटाबेस तालिका स्थापित करता है और फिर तालिका के लिए दो डेटाबेस अनुक्रमणिका बनाता है। उनके नाम इस प्रकार हैं:

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

जहां <model1> और <model2> _name हैं एक उपयुक्त मॉडल की संपत्ति। आप इसे _m2m_raise_or_create_relation . में देख सकते हैं ओडू की विधि BaseModel

हालांकि एक कैच है। PostgreSQL (इंडेक्स आइडेंटिफ़ायर सहित) में डिफ़ॉल्ट इंडिफ़ायर द्वारा 63 वर्णों से अधिक लंबा नहीं हो सकता :

Odoo इसे ध्यान में नहीं रखता है। यह खुशी से बहुत लंबे पहचानकर्ता उत्पन्न करता है, जिसे बाद में PostgreSQL द्वारा छोटा कर दिया जाता है। यदि दोनों पहचानकर्ता समान पहले 63 वर्ण साझा करते हैं (जो कि लंबे समय तक पहचानकर्ताओं के लिए काफी संभावना है) तो उन्हें PostgreSQL द्वारा समान माना जाएगा। इसका मतलब है कि पहला इंडेक्स बनाया जाएगा, लेकिन दूसरा बनाने से एक त्रुटि होगी, क्योंकि यह एक पहचानकर्ता को साझा करता है जो पहले से ही इस्तेमाल किया गया था (कम से कम पोस्टग्रेएसक्यूएल के अनुसार)।

तो _name . की अधिकतम लंबाई क्या है? संपत्ति समस्या से बचने के दौरान हो सकती है? यह इस बात पर निर्भर करता है कि m2m संबंध में दो मॉडलों के नामों के बीच कितने वर्ण साझा किए गए हैं, लेकिन पहचानकर्ता काट-छाँट से पूरी तरह बचने के लिए आपको कभी भी 16 वर्णों से अधिक लंबे नामों का उपयोग नहीं करना चाहिए।

16 क्यों? PostgreSQL पहचानकर्ता 63 वर्णों से अधिक लंबा नहीं हो सकता है। ओडू द्वारा उत्पन्न सूचकांक पहचानकर्ताओं में 15 निश्चित वर्ण होते हैं। यह हमें 48 वर्णों के साथ छोड़ देता है, जिन्हें मॉडल नामों की तीन पुनरावृत्तियों को समायोजित करना होता है। यह बदले में हमें प्रति एकल मॉडल नाम 16 वर्णों के साथ छोड़ देता है।

समस्या को हल करने का दूसरा तरीका यह होगा कि relation . के माध्यम से मैन्युअल रूप से एक संक्षिप्त संबंध नाम सेट किया जाए Many2many . पर विशेषता फ़ील्ड.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP से पूछे जाने पर दृश्य के अंदर Postgresql regexp_matches हमेशा शून्य लौटाता है

  2. Postgres फ़ंक्शन के लिए डिफ़ॉल्ट रिटर्न मान सेट करें

  3. Linux पर PostgreSQL डेटाबेस डिफ़ॉल्ट स्थान

  4. पोस्टग्रेएसक्यूएल - खाली टेबल

  5. SQL क्वेरी - कुछ परिणाम कैसे शामिल न करें