7

अजगर 2.7.9 Django बनाने प्रकार भारी मात्रा में 1.7 MySQL 5.6Django - कुशलता से विरासत में मिला मॉडल

मैं, कई वर्गों से संबंधित वस्तु उदाहरणों की एक पूरी गुच्छा पॉप्युलेट एक भी create() तरह क्वेरी में उन्हें ढेर चाहते हैं , डेटाबेस कनेक्शन खोलें, क्वेरी निष्पादित करें, फिर बंद करें। मेरा मुख्य प्रेरणा प्रदर्शन है, लेकिन कोड कॉम्पैक्टनेस भी एक प्लस है।

bulk_create() की कार्यक्षमता वास्तव में होना करने के लिए मैं क्या चाहते हैं प्रकट होता है, लेकिन मैं

It does not work with many-to-many relationships.

और

It does not work with child models in a multi-table inheritance scenario.

ये सीमाएं हैं here सूचीबद्ध चेतावनियां कम से कम एक का उल्लंघन करते हुए हूँ, यानी the source code में भी वर्णित है:

# So this case is fun. When you bulk insert you don't get the primary 
# keys back (if it's an autoincrement), so you can't insert into the 
# child tables which references this. There are two workarounds, 1) 
# this could be implemented if you didn't have an autoincrement pk, 
# and 2) you could do it by doing O(n) normal inserts into the parent 
# tables to get the primary keys back, and then doing a single bulk 
# insert into the childmost table. Some databases might allow doing 
# this by using RETURNING clause for the insert query. We're punting 
# on these for now because they are relatively rare cases. 

लेकिन त्रुटि दी जब मैं प्रयास यह सामान्य

ValueError: Can't bulk create an inherited model

मेरे मॉडल जाहिरा तौर पर शामिल नहीं है किसी भी कई करने वाली कई क्षेत्रों या विदेशी कुंजी। यह मेरे लिए बिल्कुल स्पष्ट नहीं है कि वे किस बहु-टेबल विरासत परिदृश्य का जिक्र कर रहे हैं, इसलिए मुझे यकीन नहीं है कि यह मेरी समस्या है या नहीं। मैं मैं अपने संरचना है कि इस तरह दिखता है लेकिन फिर मैं सामान्य त्रुटि मिली के साथ द्वारा पर्ची सकता है उम्मीद कर रहा था, इसलिए कोई पासा:

child class with OneToOneField---\ 
            \ 
child class with OneToOneField----->---concrete parent class 
           /
child class with OneToOneField---/ 

जहाँ तक समाधान स्रोत में सुझाव के रूप में, # 1 नहीं करने के लिए एक विकल्प है मैं, और # 2 आकर्षक लग रहा नहीं है क्योंकि मुझे लगता है कि यह उस प्रदर्शन में लाभ बलिदान करेगा जो मैं जा रहा हूं।

क्या ऐसे अन्य कामकाज हैं जो इस तरह की विरासत को संभालने के दौरान bulk_create() अनुकरण कर सकते हैं और प्रदर्शन में लाभ नहीं छोड़ सकते हैं? क्या मुझे कच्चे एसक्यूएल पर वापस जाने की ज़रूरत है? मैं प्रत्येक बच्चे ऑब्जेक्ट प्रकार के लिए एक अलग संग्रह बनाने और अलग INSERT/create() निष्पादित करने पर ध्यान नहीं रखूंगा।

उत्तर

8

मैं जिस कामकाज पर बस गया था वह एस with transaction.atomic(): में मेरे सभी एकत्रित लपेट रहा था। यह किसी भी डेटाबेस कनेक्शन को खोलने या किसी भी प्रश्न निष्पादित करने तक चलने का समय बहुत कम हो गया जब तक कि सभी पाइथन वापस नहीं आये।

एक नकारात्मक पक्ष यह हो सकता है कि अगर किसी भी त्रुटि का सामना करना पड़ता है तो सभी परिवर्तन वापस लुढ़क जाते हैं और डेटाबेस छूटा नहीं जाता है। create() एस को बैचों में तोड़कर और प्रत्येक के चारों ओर एक लेनदेन को खोलकर बंद करके इसका उपचार किया जा सकता है। (मेरे मामले में यह वांछित व्यवहार नहीं था क्योंकि मैं सभी डेटा चाहता था या इनमें से कोई भी नहीं।)

संबंधित मुद्दे