web-dev-qa-db-ja.com

pandasからPYODBCを使用してSQLサーバーにデータを取得する

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サーバーにこれを取得するために次のジャンプを行う方法、または最初にファイルに保存せずに可能である場合でも、理解できません。

19
andy redmayne

「SQLサーバーへの書き込み」部分では、pandasの便利なto_sqlメソッドを使用できます(したがって、行を繰り返し処理して挿入を手動で行う必要はありません。パンダを使用したSQLデータベース: http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql

これを機能させるには、少なくともpandas 0.14が必要です。また、sqlalchemyをインストールする必要があります。dfread_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にインポート を参照してください

33
joris

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()
4
Random

Bcpユーティリティ( https://docs.Microsoft.com/en-us/sql/tools/bcp-utility )を使用すると、大きなデータセットがある場合に最適に機能することがわかりました。 80K行/秒で挿入する270万行があります。データフレームをcsvファイルとして保存できます(データにタブとutf8エンコードがない場合は、区切りにタブを使用します)。 bcpでは、フォーマット「-c」を使用しましたが、これまでのところ問題なく機能しています。

2