2016-05-03 6 views
5

एक पायथन लिपि में, मुझे एक डेटास्रोत पर एक क्वेरी चलाने की आवश्यकता है और उस क्वेरी से प्रत्येक पंक्ति को एक अलग डेटा स्रोत पर एक तालिका में डालने की आवश्यकता है। मैं सामान्य रूप से एक एकल सम्मिलित/चयन कथन के साथ ऐसा करता हूं जिसमें एक tsql लिंक किए गए सर्वर शामिल होते हैं लेकिन मेरे पास इस विशेष डेटास्रोत से कोई लिंक सर्वर कनेक्शन नहीं है।मूल pyodbc थोक सम्मिलित करें

मुझे इसका एक सरल pyodbc उदाहरण खोजने में परेशानी हो रही है। यहां बताया गया है कि मैं इसे कैसे करूंगा लेकिन मुझे लगता है कि एक लूप के अंदर एक सम्मिलन कथन निष्पादित करना बहुत धीमा है।

result = ds1Cursor.execute(selectSql) 

for row in result: 
    insertSql = "insert into TableName (Col1, Col2, Col3) values (?, ?, ?)" 
    ds2Cursor.execute(insertSql, row[0], row[1], row[2]) 
    ds2Cursor.commit() 

क्या पीओडीबीसी के साथ रिकॉर्ड डालने का एक बेहतर थोक तरीका है? या यह वैसे भी ऐसा करने का एक अपेक्षाकृत प्रभावी तरीका है। मैं एसक्यूएलसेवर 2012 और नवीनतम पायडबैक और पायथन संस्करणों का उपयोग कर रहा हूं।

उत्तर

7

इसे संभालने का सबसे अच्छा तरीका है pyodbc फ़ंक्शन executemany का उपयोग करना।

ds1Cursor.execute(selectSql) 
result = ds1Cursor.fetchall() 


ds2Cursor.executemany('INSERT INTO [TableName] (Col1, Col2, Col3) VALUES (?, ?, ?)', result) 
ds2Cursor.commit() 
+8

बस एक नोट, निष्पादन वास्तव में सच बल्किन्सर्ट नहीं करता है। दृश्य के पीछे यह अभी भी 1 से 1 सम्मिलित करता है। यह वास्तव में एक आवरण है जो डेटा को अधिक पाइथनिक रूप से सोर्स करने की अनुमति देता है। यह एसओ पोस्ट उचित बल्बकिन्स प्रस्तुत करता है। http://stackoverflow.com/questions/29638136/how-to-speed-up-with-bulk-insert-to-ms-server-from-python-with-pyodbc-from-csv – casbby

4

यहां एक ऐसा फ़ंक्शन है जो SQL सर्वर डेटाबेस में थोक सम्मिलित कर सकता है।

import pypyodbc 
import contextlib 

def bulk_insert(table_name, file_path): 
    string = "BULK INSERT {} FROM '{}' (WITH FORMAT = 'CSV');" 
    with contextlib.closing(pypyodbc.connect("MYCONN")) as conn: 
     with contextlib.closing(conn.cursor()) as cursor: 
      cursor.execute(string.format(table_name, file_path)) 
     conn.commit() 
     conn.close() 

यह निश्चित रूप से काम करता है। अद्यतनों के कारण, pyodbc के बजाय pypyodbc का उपयोग करना बेहतर है।

+1

यह सही उत्तर है, और इस तरह स्वीकार किया जाना चाहिए। निष्पादन विधि विधि थोक सम्मिलन की गति के लिए एक विकल्प नहीं है। ध्यान दें, यदि आप SQL सर्वर पर फ़ाइल की बजाय एक पुनरावर्तक से थोक प्रविष्टि करना चाहते हैं, तो ctds ड्राइवर एक विकल्प है। https://pypi.python.org/pypi/ctds/ – Kerr

+0

केवल आपके द्वारा प्रदान किए गए लिंक को चेक आउट करें। मुझे लगता है कि यह वास्तव में अच्छा लग रहा है। इसे आज़माएं। धन्यवाद। – Naufal

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