使用PYODBC从pandas获取数据到SQL服务器

and*_*yne 20 python sql pyodbc pandas

我试图了解python如何将数据从FTP服务器提取到pandas然后将其移动到SQL服务器.我的代码至少可以说是非常简陋的,我正在寻找任何建议或帮助.我试图从FTP服务器首先加载数据工作正常....如果我然后删除此代码并将其更改为从ms sql服务器中选择它是好的所以连接字符串工作,但插入到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!"
Run Code Online (Sandbox Code Playgroud)

当我删除ftp代码时,它运行完美,但我不明白如何进行下一次跳转以将其转换为Microsoft SQL服务器,或者即使可以在不先保存到文件中也是如此.

jor*_*ris 34

对于"写入sql server"部分,您可以使用方便to_sql的pandas方法(因此无需迭代行并手动执行插入).请参阅有关使用pandas与SQL数据库交互的文档:http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql

你需要至少pandas 0.14来使这个工作,你还需要sqlalchemy安装.一个例子,假设df是你得到的DataFrame read_table:

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)
Run Code Online (Sandbox Code Playgroud)

另请参阅文档页面to_sql.
有关如何使用sqobchemy为sql server创建连接引擎的更多信息,请访问:http://docs.sqlalchemy.org/en/rel_1_1/dialects/mssql.html#dialect-mssql-pyodbc-connect


但是,如果您的目标是将csv数据放入SQL数据库,您还可以考虑直接从SQL执行此操作.请参阅例如将CSV文件导入SQL Server

  • @joris,请更新答案,链接的文档页面建议从 1.0.0 开始,您需要明确指定驱动程序,`create_engine("mssql+pyodbc://scott:tiger@myhost:port/databasename?driver=SQL+Server +Native+Client+10.0")` 我试图在没有指定引擎的情况下连接引擎,我的 to_sql 一直抱怨我没有选择驱动程序 (4认同)

Ran*_*dom 6

使用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()
Run Code Online (Sandbox Code Playgroud)

  • 这种将 Python 连接到 MS SQL Server 的方法对我来说是最好的 (3认同)

Ser*_*nko 5

是的,该bcp实用程序似乎是大多数情况下的最佳解决方案。

如果你想留在 Python 中,下面的代码应该可以工作。

from sqlalchemy import create_engine
import urllib
import pyodbc

quoted = urllib.parse.quote_plus("DRIVER={SQL Server};SERVER=YOUR\ServerName;DATABASE=YOur_Database")
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

df.to_sql('Table_Name', schema='dbo', con = engine, chunksize=200, method='multi', index=False, if_exists='replace')
Run Code Online (Sandbox Code Playgroud)

不要避免method='multi',因为它显着减少了任务执行时间。

有时您可能会遇到以下错误。

ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]传入的请求参数太多。服务器最多支持2100个参数。减少参数数量并重新发送请求. (8003) (SQLExecDirectW)')

在这种情况下,请确定数据框中的列数:df.shape[1]。将支持的最大参数数除以该值,并将结果的下限用作块大小。