PYODBC

2014-09-04 6 views
8

के साथ पांडा से SQL सर्वर में डेटा प्राप्त करें मैं समझने की कोशिश कर रहा हूं कि पाइथन एक FTP सर्वर से डेटा को पांडा में कैसे खींच सकता है और इसे SQL सर्वर में ले जाया जा सकता है। यहां मेरा कोड कम से कम कहने के लिए बहुत ही प्राथमिक है और मैं किसी भी सलाह या मदद की तलाश में हूं। मैंने पहले FTP सर्वर से डेटा लोड करने का प्रयास किया है जो ठीक काम करता है .... अगर मैं इस कोड को हटा देता हूं और इसे ms sql सर्वर से किसी चयन में बदलता हूं तो यह ठीक है इसलिए कनेक्शन स्ट्रिंग काम करता है, लेकिन SQL में सम्मिलन सर्वर समस्या पैदा कर रहा है।PYODBC

import pyodbc 
import pandas 
from ftplib import FTP 
from StringIO import StringIO 
import csv 

ftp = FTP ('ftp.xyz.com','user','pass') 
ftp.set_pasv(True) 
r = StringIO() 
ftp.retrbinary('filname.csv', r.write) 

pandas.read_table (r.getvalue(), delimiter=',') 


connStr = ('DRIVER={SQL Server Native Client 10.0};SERVER=localhost;DATABASE=TESTFEED;UID=sa;PWD=pass') 
conn = pyodbc.connect(connStr) 

cursor = conn.cursor() 
cursor.execute("INSERT INTO dbo.tblImport(Startdt, Enddt, x,y,z,)" "VALUES     (x,x,x,x,x,x,x,x,x,x.x,x)") 
cursor.close() 
conn.commit() 
conn.close() 
print"Script has successfully run!" 

जब मैं एफ़टीपी कोड इस पूरी तरह से चलाता है निकालने के लिए, लेकिन मुझे समझ नहीं आता कि कैसे Microsoft SQL सर्वर में इसे पाने के लिए अगले कूद बनाने के लिए, या यहां तक ​​कि अगर यह पहली बार एक फ़ाइल में सहेजे बिना संभव है।

+0

क्या आप जानते हैं कि 'execute' फ़ंक्शन पर पैरामीटर कैसे पास करें? यदि ऐसा है, तो आपको केवल 'डेटाफ्रेम' की पंक्तियों पर पुनरावृत्ति की आवश्यकता है और प्रत्येक के लिए, 'निष्पादित करें' पर कॉल करें और पंक्ति को SQL पैरामीटर के मानों के रूप में पास करें। या, यदि पीओओडीबीसी 'एक्जिक्यूमैन' का समर्थन करता है, तो यह भी आसान है-बस पंक्तियों के किसी भी पुनरावर्तक को पास करें, जो आपके पास पहले से है। – abarnert

+0

कहा जा रहा है, क्या कोई कारण है कि आप यहां 'सीएसवी' के बजाय पांडों का उपयोग कर रहे हैं? आप वास्तव में डेटा के साथ पांडस-वाई कुछ भी नहीं कर रहे हैं, बस इसे खत्म कर रहे हैं। इस तरह के मामले में, 'सीएसवी' बहुत आसान है, और पूरी चीज को स्मृति में एक बार में पढ़ने की आवश्यकता नहीं है। – abarnert

+0

उत्तर के लिए धन्यवाद मैं वास्तव में किसी अन्य कारण के लिए पांडा का उपयोग नहीं कर रहा हूं, इसके बारे में मैंने पढ़ा है और यह डेटाफ्रेम में डंप करने के लिए तार्किक लग रहा था। मेरा मूल उद्देश्य सीएसवी के साथ एसक्यूएल डेटा को एसक्यूएल में प्राप्त करना है, तो यह घटना के बाद सीवीएस फ़ाइल द्वारा ही संभव होगा? idealy मैं एक बार में एसक्यूएल में खींच और धक्का देना चाहता हूँ। डेटा के संदर्भ में –

उत्तर

18

'एसक्यूएल सर्वर से लिखना' भाग के लिए, आप पांडा के सुविधाजनक to_sql विधि (ताकि कोई पंक्तियों पर पुनरावृति और मैन्युअल रूप से डालने करने की ज़रूरत) का उपयोग कर सकते हैं। पांडा के साथ एसक्यूएल डेटाबेस के साथ बातचीत करने के दस्तावेज़ देखें: http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql

आपको यह काम करने के लिए कम से कम पांडा 0.14 की आवश्यकता होगी, और आपको sqlalchemy स्थापित करने की भी आवश्यकता है।

import sqlalchemy 
import pyodbc 
engine = sqlalchemy.create_engine("mssql+pyodbc://<username>:<password>@<dsnname>") 

# write the DataFrame to a table in the sql database 
df.to_sql("table_name", engine) 

भी देखें documentation page of to_sql: एक उदाहरण है, यह सोचते हैं df DataFrame आप read_table से मिल गया है। कैसे pyobdc साथ एसक्यूएल सर्वर के लिए SQLAlchemy के सिलसिले इंजन बनाने के लिए पर
अधिक जानकारी के लिए, आप यहाँ पा सकते हैं: http://docs.sqlalchemy.org/en/rel_1_1/dialects/mssql.html#dialect-mssql-pyodbc-connect


लेकिन अपने लक्ष्य सिर्फ SQL डेटाबेस में csv डेटा प्राप्त करने के लिए है, तो आप कर सकते थे एसक्यूएल से सीधे ऐसा करने पर भी विचार करें। उदाहरण के लिए Import CSV file into SQL Server

+0

देर से उत्तर देने की जानकारी के लिए धन्यवाद, मैं इसके साथ काम करूंगा और मुझे यकीन है कि यह ठीक रहेगा। –

+0

मुझे इंजन.raw_connection() में पास करना पड़ा जैसा कि यहां बताया गया है https://stackoverflow.com/questions/20401392/read-frame-with-sqlalchemy-mysql-and-pandas –

+1

@ रिचर्डब्लैकमैन जो पांडा संस्करण 0.14 के लिए सही नहीं है और ऊपर। उस स्थिति में, आपको बस इंजन को ही पास करना चाहिए (लेकिन, जो उत्तर आपने लिंक किया है वह पांडा <= 0.13) – joris

1

मैंने पाया कि बीसीपी उपयोगिता (https://docs.microsoft.com/en-us/sql/tools/bcp-utility) का उपयोग करके आपके पास एक बड़ा डेटासेट होता है। मेरे पास 2.7 मिलियन पंक्तियां हैं जो 80 के पंक्तियों/सेकंड पर आती हैं। आप अपने डेटा फ्रेम को सीएसवी फ़ाइल के रूप में स्टोर कर सकते हैं (अगर आपके डेटा में टैब और यूटीएफ 8 एन्कोडिंग नहीं है तो विभाजक के लिए टैब का उपयोग करें)। बीसीपी के साथ, मैंने प्रारूप "-c" का उपयोग किया है और यह अब तक बिना किसी समस्या के काम करता है।

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