मुझे Django का उपयोग MySQL 5.5.22 के साथ निम्न समस्या है।MySQL अद्यतन एकाधिक कॉलम बदलना गैर-परमाणु है?
id a11 a12 a21 a22 level
324 3 2 5 3 2
को देखते हुए एक क्वेरीसमूह qs, मैं निम्नलिखित अद्यतन करना:
देखते हुए कॉलम आईडी, स्तर और एक 2x2 मैट्रिक्स A11 के रूप में जमा, A12, A21, A22 के साथ एक मेज, मैं इस पंक्ति है
UPDATE `storage`
SET
`a21` = (3 * `storage`.`a11`) + (-1 * `storage`.`a21`),
`a22` = (3 * `storage`.`a12`) + (-1 * `storage`.`a22`),
`level` = `storage`.`level` - -1,
`a11` = (2 * `storage`.`a11`) + (-1 * `storage`.`a21`),
`a12` = (2 * `storage`.`a12`) + (-1 * `storage`.`a22`)
:
qs.update(
a11=(b12 * a21 - b11 * a22) * F('a11') + (b11 * a12 - b12 * a11) * F('a21'),
a12=(b12 * a21 - b11 * a22) * F('a12') + (b11 * a12 - b12 * a11) * F('a22'),
a21=(b22 * a21 - b21 * a22) * F('a11') + (b21 * a12 - b22 * a11) * F('a21'),
a22=(b22 * a21 - b21 * a22) * F('a12') + (b21 * a12 - b22 * a11) * F('a22'),
level=(F('level') - 1)
)
जो के लिए Django निम्न क्वेरी उत्पन्न करता है (db.connection.queries से समझ में आ गया है, जहां संक्षिप्तता के लिए खंड निकालने के लिए) 63,210
और मेरी पंक्ति उस के बाद इस तरह दिखता है:
id a11 a12 a21 a22 level
324 2 1 4 3 1
किसी भी पंक्ति के लिए, a12*a21 - a11*a22 = 1
सच माना जाता है, और कहा कि के अनुसार, पंक्ति होना चाहिए था:
id a11 a12 a21 a22 level
324 1 1 4 3 1
यह वह जगह है मैं SQLite पर क्या प्राप्त करता हूं, Django एक ही क्वेरी उत्पन्न करता है, और मुझे यह समझने में काफी समय लगा कि MySQL कुछ अलग कर रहा था। क्वेरी से, ऐसा लगता है कि इंटरडिपेंट एकाधिक पंक्तियों को अपडेट करते समय, MySQL इसे एक परमाणु ऑपरेशन के रूप में नहीं मानता है, और कॉलम अपडेट होने पर, वे उन पर निर्भर मानों को प्रभावित करते हैं। मैं इस बात की पुष्टि इस होना करने के लिए क्या अजगर शीघ्र पर निम्न कोड से होता है लगता है:
>>> a11, a12, a21, a22 = (3, 2, 5, 3)
>>> (2 * a11) + (-1 * a21),\
... (2 * a12) + (-1 * a22),\
... (3 * a11) + (-1 * a21),\
... (3 * a12) + (-1 * a22)
(1, 1, 4, 3)
कॉलम एक समय में एक अपडेट किया जाता है, तो क्वेरी द्वारा दिए गए एक ही क्रम में,:
>>> a11, a12, a21, a22 = (3, 2, 5, 3)
>>> a21 = (3*a11) + (-1*a21)
>>> a22 = (3*a12) + (-1*a22)
>>> a11 = (2*a11) + (-1*a21)
>>> a12 = (2*a12) + (-1*a22)
>>> (a11, a12, a21, a22)
(2, 1, 4, 3)
यह वास्तव में डरावना व्यवहार है, क्योंकि यह एक पुस्तकालय है जिसका उपयोग क्रॉस-प्लेटफॉर्म का उपयोग किया जाना है। मेरे प्रश्न हैं:
- कौन सा गलत कर रहा है, MySQL या SQLite? क्या इसे एक बग माना जा सकता है?
- मैं अन्य प्रमुख डेटाबेस (ओरेकल, पोस्टग्रेएसक्यूएल और एसक्यूएलसेवर) से क्या उम्मीद कर सकता हूं?
- इस व्यवहार को सामान्य करने के लिए मैं Django ORM (कोई कच्चे प्रश्न) के साथ क्या कर सकता हूं?
संपादित
समस्या स्पष्ट है, लेकिन मैं अभी भी एक समाधान के लिए देख रहा हूँ। सभी मूल्यों को खींचकर और उन्हें वापस धक्का देना इस विशेष एप्लिकेशन के लिए एक स्वीकार्य समाधान नहीं है।
यह एक दिलचस्प सवाल है। मैंने इसके साथ [sqlfiddle] (http://sqlfiddle.com/#!2/7f14b/2) पर खेला और ऐसा लगता है कि MySQL ही एकमात्र ऐसा है जो इस तरह से व्यवहार करता है। – Chad
संबंधित/डुप्लिकेट: http://stackoverflow.com/questions/2203202/sql-update-order-of- मूल्यांकन – pilcrow
नीचे मेरा अद्यतन उत्तर देखें। – eggyal