pythonがFTPサーバーからデータをpandasに移動し、これをSQLサーバーに移動する方法を理解しようとしています。ここでの私のコードは非常に初歩的なものです。少なくとも、アドバイスやヘルプを探しています。最初にFTPサーバーからデータをロードしようとしましたが、うまくいきます。その後、このコードを削除し、ms SQLサーバーからselectに変更します。接続文字列は機能しますが、SQLサーバーへの挿入が問題を引き起こしているようです。
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!"
Ftpコードを削除すると、これは完全に実行されますが、Microsoft SQLサーバーにこれを取得するために次のジャンプを行う方法、または最初にファイルに保存せずに可能である場合でも、理解できません。
「SQLサーバーへの書き込み」部分では、pandasの便利なto_sql
メソッドを使用できます(したがって、行を繰り返し処理して挿入を手動で行う必要はありません。パンダを使用したSQLデータベース: http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql
これを機能させるには、少なくともpandas 0.14が必要です。また、sqlalchemy
をインストールする必要があります。df
がread_table
から取得したDataFrameである場合の例:
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)
to_sql
のドキュメントページ もご覧ください。
pyobdcを使用したsqlサーバー用のsqlalchemyで接続エンジンを作成する方法の詳細については、次を参照してください: http://docs.sqlalchemy.org/en/rel_1_1/dialects/mssql.html# dialect-mssql-pyodbc-connect
ただし、csvデータをSQLデータベースに取り込むだけの場合は、SQLから直接これを行うことも検討できます。例 CSVファイルをSQL Serverにインポート を参照してください
LocalDB SQLインスタンスを使用するPython3バージョン:
from sqlalchemy import create_engine
import urllib
import pyodbc
import pandas as pd
df = pd.read_csv("./data.csv")
quoted = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};SERVER=(localDb)\ProjectsV14;DATABASE=database")
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))
df.to_sql('TargetTable', schema='dbo', con = engine)
result = engine.execute('SELECT COUNT(*) FROM [dbo].[TargetTable]')
result.fetchall()
Bcpユーティリティ( https://docs.Microsoft.com/en-us/sql/tools/bcp-utility )を使用すると、大きなデータセットがある場合に最適に機能することがわかりました。 80K行/秒で挿入する270万行があります。データフレームをcsvファイルとして保存できます(データにタブとutf8エンコードがない場合は、区切りにタブを使用します)。 bcpでは、フォーマット「-c」を使用しましたが、これまでのところ問題なく機能しています。