2016-02-01 7 views
13

तो मेरे पास एक पाइथन स्क्रिप्ट है जो लगभग 350,000 डेटा ऑब्जेक्ट्स के माध्यम से जाती है, और कुछ परीक्षणों के आधार पर, इसे एक पंक्ति को अपडेट करने की आवश्यकता होती है जो उन वस्तुओं में से प्रत्येक को MySQl डीबी में दर्शाती है। मैं pymysql का भी उपयोग कर रहा हूं क्योंकि मुझे इसके साथ कम से कम परेशानी हुई है, खासकर जब बड़े चयन प्रश्नों पर भेजना (where column IN (....) खंड के साथ विवरण चुनें जिसमें 100,000+ मूल्य हो सकते हैं)।PyMySQL एक क्वेरी में अलग-अलग अपडेट?

चूंकि प्रत्येक पंक्ति के लिए प्रत्येक अद्यतन अलग हो सकता है, प्रत्येक अद्यतन कथन अलग है। उदाहरण के लिए, एक पंक्ति के लिए हम first_name अपडेट करना चाहेंगे लेकिन एक और पंक्ति के लिए हम first_name को छूना चाहते हैं और हम last_name अपडेट करना चाहते हैं।

यही कारण है कि मैं cursor.executemany() विधि का उपयोग नहीं करना चाहता जो एक सामान्य अद्यतन कथन में लेता है और फिर आप इसे मानते हैं, हालांकि मैंने प्रत्येक मान अलग किया है, इसलिए एक सामान्य अद्यतन कथन वास्तव में नहीं है मेरे मामले के लिए काम करते हैं। मैं तार पर व्यक्तिगत रूप से 350,000 से अधिक अद्यतन विवरण भी नहीं भेजना चाहता हूं। क्या वैसे भी मैं अपने सभी अपडेट स्टेटमेंट्स को एक साथ पैकेज कर सकता हूं और उन्हें एक बार भेज सकता हूं?

मैंने उन्हें सभी एक प्रश्न में रखने और cursor.execute() विधि का उपयोग करने की कोशिश की लेकिन यह सभी पंक्तियों को अपडेट नहीं कर रहा है।

+0

कितने अलग-अलग प्रकार के अपडेट हैं? यानी आप लाखों मूल्यों के उन तीसरे मूल्यों के साथ कितनी अलग तालिकाओं को अपडेट कर रहे हैं? और उन तालिकाओं पर कितने अलग कॉलम? यानी क्या यह कुछ अलग अद्यतन बयान है? –

+1

क्या 'एक प्रश्न' या 'एक तिहाई मिलियन' प्रश्नों के अलावा अन्य उपयोगी विकल्प हैं? डाटाबेस में डेटा को 'वर्क टेबल' में लोड किया गया था और उससे उसमें हेरफेर करने के बारे में क्या होगा? डेटाबेस में डेटा के साथ खेलने जैसे डाटाबेस? –

+0

@RyanVincent वे सभी एक ही टेबल को अपडेट करते हैं हालांकि तालिका में 12 कॉलम हैं और प्रत्येक अपडेट स्टेटमेंट कॉलम के किसी भी अलग संयोजन को 1 कॉलम से 10 कॉलम तक अपडेट कर सकता है। –

उत्तर

4

एसक्यूएल # 1: CREATE TABLE t जो भी कॉलम आपको बदलने की आवश्यकता हो सकती है। उन सभी को NULL (NOT NULL के विपरीत) बनाएं।

एसक्यूएल # 2: आवश्यक सभी परिवर्तनों के थोक INSERT (या LOAD DATA) करें। उदाहरण के लिए, अगर केवल first_name बदलते हैं, तो id और first_name भरें, लेकिन अन्य कॉलम NULL हैं।

एसक्यूएल # 3-14:

UPDATE real_table 
    JOIN t ON t.id = real_table.id 
    SET real_table.first_name = t.first_name 
    WHERE t.first_name IS NOT NULL; 
# ditto for each other column. 

# 1 को छोड़कर सभी SQLs समय लेने वाली हो जाएगा। और, चूंकि UPDATE को पूर्ववत लॉग बनाने की आवश्यकता है, यह समय-समय पर या अन्यथा समस्याग्रस्त हो सकता है। यदि आवश्यक हो तो a discussion of chunking देखें।

यदि आवश्यक हो

, कार्यों ऐसे COALESCE(), GREATEST(), IFNULL(), आदि के रूप

मास UPDATEs आमतौर पर गरीब स्कीमा डिजाइन संकेत का उपयोग करें।

(रयान एक 'उत्तर' के बजाय सिर्फ एक 'टिप्पणी' की, वह शायद 'इनाम' मिलना चाहिए। साथ में कूदता है तो)

+0

हाय रिक, मुझे पता है कि आपने mysql कनेक्टर के बारे में मेरे अन्य प्रश्न का उत्तर दिया है, लेकिन जब मैं pymysql लाइब्रेरी का उपयोग कर डेटा स्थानीय इन्फाइल लोड करने का प्रयास करता हूं तो मुझे एक ही त्रुटि मिल रही है। मैं कि मैं अपने मशीन या एक EC2 मशीन जहां डीबी एक आरडीएस डीबी है से कोड को चलाने की परवाह किए बिना एक टूटी हुई पाइप त्रुटि मिलती है तो मुझे शक नेटवर्क यह रहा है कि एक सप्ताह सीधे 'e_bytes उठाने err.OperationalError के लिए भद्दा (2006, "MySQL सर्वर चला गया है (% आर)"% (ई,)) pymysql.err.OperationalError: (2006, "MySQL सर्वर चला गया है (ब्रोकनपाइप एरर (32, 'टूटा हुआ पाइप'))" –

5

आपका सबसे अच्छा प्रदर्शन करता है, तो आप अपने "परीक्षण" सांकेतिक शब्दों में बदलना कर सकते हैं हो जाएगा एसक्यूएल तर्क खुद ही है, ताकि आप कुछ भी नीचे अद्यतन बयान में उबाल सकते हैं। या कम से कम जितना संभव हो उतना संभव हो, ताकि कम पंक्तियों को व्यक्तिगत रूप से अपडेट करने की आवश्यकता हो।

उदाहरण के लिए:

UPDATE tablename set firstname = [some logic] 
WHERE [logic that identifies which rows need the firstname updated]; 

आप अपने परीक्षण के बारे में ज्यादा वर्णन नहीं करते हैं, तो यह सुनिश्चित करने के लिए मुश्किल है। लेकिन आप आम तौर पर काम के साथ अपने WHERE खंड में काफी तर्क प्राप्त कर सकते हैं।

एक और विकल्प आपके तर्क को संग्रहीत प्रक्रिया में रखना होगा। आप अभी भी 350,000 अपडेट कर रहे हैं, लेकिन कम से कम वे सभी "तार पर जा रहे हैं" नहीं हैं।मैं इसे केवल अंतिम उपाय के रूप में उपयोग करूंगा, हालांकि; व्यवसाय तर्क को जब भी संभव हो, एप्लिकेशन परत में रखा जाना चाहिए, और संग्रहीत प्रक्रियाएं आपके आवेदन को कम पोर्टेबल बनाती हैं।

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