मैं नीचे दिए गए कोड का उपयोग करके MSSQL तालिका में एक अजगर डेटाफ़्रेम सम्मिलित करना चाह रहा हूँ:

conn = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};\
                       Server=esql.ecs.local;\
                       Database=drgt;\
                       Trusted_Connection=yes;')
cursor = conn.cursor()  #Create cursor


for row_count in range(0, t6.shape[0]):
    chunk = t6.iloc[row_count:row_count+1,:].values.tolist()
    tuple_of_tuples = tuple(tuple(x) for x in chunk)
    cursor.executemany("insert into DWWorking.dbo.api_Nic_Data"+"([[a],[b],[c],[d],[e],[f],\
                                                      [g],[h],[i],[j],[k],[l],[m],[n],\
                                                      [o],[p],[q],[r],[s],[t],[u],[v],\
                                                      [w],[x],[y],[z],[ab],[cd],\
                                                      [ef],[gh],[ij],[kl]])\
                                                        values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
                                                                    tuple_of_tuples)

कर्सर खोला गया है और मैंने जाँच की है कि तालिका मौजूद है और इसमें आवश्यक कॉलम हैं। निष्पादित करते समय मुझे अभी भी निम्न त्रुटि प्राप्त होती है:

प्रोग्रामिंग त्रुटि: ('एसक्यूएल में 0 पैरामीटर मार्कर हैं, लेकिन 33 पैरामीटर दिए गए थे', 'एचवाई000')

मैं कैसे हल कर सकता हूँ?

0
user10 2 नवम्बर 2020, 00:50

2 जवाब

सबसे बढ़िया उत्तर

मूल क्वेरी को उचित SQL के साथ काम करना चाहिए जिसमें INSERT INTO कॉलम सूची को संलग्न करने वाले ब्रैकेट नहीं हैं। इसके अतिरिक्त, executemany को डेटा फ्रेम पंक्तियों में किसी भी for लूप की आवश्यकता नहीं होनी चाहिए और यह df.to_sql से तेज हो सकता है। साथ ही, टेबल और कॉलम आइडेंटिफ़ायर को सिंगल कोट्स का उपयोग नहीं करना चाहिए।

वैसे, आसान मल्टी-लाइन स्ट्रिंग्स के लिए, पायथन के ट्रिपल कोट स्ट्रिंग पर विचार करें। ध्यान दें, चूंकि पंडों v0.24, .to_numpy को .values से अधिक अनुशंसित विधि है (देखें docs)। नीचे मान लिया गया है कि डेटा फ्रेम में ठीक 32 कॉलम होते हैं जो प्रत्येक मैप को संबंधित टेबल कॉलम से जोड़ते हैं।

sql = """INSERT INTO DWWorking.dbo.api_Nic_Data 
            ([a],[b],[c],[d],[e],[f],[g],[h],[i],[j],
             [k],[l],[m],[n],[o],[p],[q],[r],[s],[t],
             [u],[v] [w],[x],[y],[z],[ab],[cd],[ef],[gh],[ij],[kl])
         VALUES (?,?,?,?,?,?,?,?,?,?,
                 ?,?,?,?,?,?,?,?,?,?,
                 ?,?,?,?,?,?,?,?,?,?,?,?)
      """ 

cursor.executemany(sql, t6.to_numpy().tolist())
1
Parfait 2 नवम्बर 2020, 03:00

भावी पाठकों के लिए उचित उत्तर प्रदान करने के लिए...

टिप्पणियों के बाद, यह निम्नलिखित का उपयोग करने के लिए अधिक सीधा और संभावित रूप से अधिक कुशल होगा:

  • पांडा DataFrame.to_sql() समारोह
  • sqlalchemy engine ऑब्जेक्ट

दोनों के लिए डॉक्स यहां देखे जा सकते हैं:

चूंकि इसके लिए उपयोग के मामले हर मामले में बहुत भिन्न हो सकते हैं, कृपया कोड उदाहरणों के लिए आधिकारिक डॉक्स देखें।

0
S3DEV 2 नवम्बर 2020, 01:55