使用PYODBC将熊猫中的数据获取到SQL服务器中

问题描述 投票:21回答:4

我试图了解python如何将数据从FTP服务器拉到熊猫,然后将其移到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!"

[当我删除ftp代码时,它运行得很好,但是我不知道如何进行下一次跳转,以将其导入Microsoft SQL Server,或者即使不先保存到文件中也可以。

python sql pandas pyodbc
4个回答
40
投票

对于“写入sql服务器”部分,您可以使用方便的pandas to_sql方法(因此无需遍历行并手动进行插入)。请参阅有关使用Pandas与SQL数据库进行交互的文档:http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql

您至少需要熊猫0.14才能正常运行,并且还需要安装sqlalchemy。例如,假设df是您从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)

另请参见documentation page of to_sql。有关如何为带有pyobdc的sql server的sqlalchemy创建连接引擎的更多信息,您可以在这里找到:to_sql


但是,如果您的目标只是将csv数据导入SQL数据库,则也可以考虑直接从SQL执行此操作。参见例如http://docs.sqlalchemy.org/en/rel_1_1/dialects/mssql.html#dialect-mssql-pyodbc-connect


9
投票

使用LocalDB SQL实例的Python3版本:

Import CSV file into SQL Server

3
投票

我发现当数据集很大时,使用bcp实用程序(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() )效果最佳。我有270万行,每秒插入80K行。您可以将数据帧存储为csv文件(如果数据没有制表符和utf8编码,请使用制表符作为分隔符)。对于bcp,我使用的格式为“ -c”,到目前为止,它可以正常工作。


0
投票

是,https://docs.microsoft.com/en-us/sql/tools/bcp-utility实用程序似乎是大多数情况下的最佳解决方案。

如果您希望保留在Python中,则以下代码应该起作用。

bcp

不要回避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') ,因为它会大大减少任务执行时间。

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

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

在这种情况下,请确定数据框中的列数:method='multi'。将最大支持的参数数量除以该值,然后将结果的下限用作块大小。

© www.soinside.com 2019 - 2024. All rights reserved.