Python 使用pymssql将数据插入SQL Server表

Python 使用pymssql将数据插入SQL Server表,python,sql-server,pandas,pymssql,Python,Sql Server,Pandas,Pymssql,我正在尝试将数据帧写入SQL Server表。我的代码: conn = pymssql.connect(host="Dev02", database="DEVDb") cur = conn.cursor() query = "INSERT INTO dbo.SCORE_TABLE VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" cur.executemany(quer

我正在尝试将数据帧写入SQL Server表。我的代码:

conn = pymssql.connect(host="Dev02", database="DEVDb")
cur = conn.cursor()
query = "INSERT INTO dbo.SCORE_TABLE VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
cur.executemany(query, df_sql)
conn.commit()
cur.close()
conn.close()
df_sql
的维度是
(5860,20)
,即数据框中的列数与sql Server表中的列数相同。但我还是遇到了以下错误:

ValueError:sql中的占位符多于可用的参数

更新如下

根据其中一条评论,我尝试使用
turbodbc
,如下所示:

conn = turbodbc.connect(driver="{SQL Server}", server="Dev02", Database="DEVDb")
conn.use_async_io = True
cur = conn.cursor()
query = "INSERT INTO dbo.STG_CONTACTABILITY_SCORE VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
cur.executemany(query, df_sql.values)
cur.commit()
cur.close()
conn.close()
[nan 'DUSTIN HOPKINS' 'SOUTHEAST MISSOURI STATE UNIVERSITY' 13.0
  '5736512217' None None 'Monday' '8:00AM' '9:00AM' 'Summer' None None None
  None '2017-12-22 10:39:30.626331' 'Completed' None '1-11KUFFZ'
  'Central Time Zone']
我遇到以下错误:

ValueError:包含多个元素的数组的真值为 模棱两可的。使用a.any()或a.all()

我不明白。这里出了什么问题。我看到
df_sql.values
,没有发现任何错误

ndarray的第一行如下所示:

conn = turbodbc.connect(driver="{SQL Server}", server="Dev02", Database="DEVDb")
conn.use_async_io = True
cur = conn.cursor()
query = "INSERT INTO dbo.STG_CONTACTABILITY_SCORE VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
cur.executemany(query, df_sql.values)
cur.commit()
cur.close()
conn.close()
[nan 'DUSTIN HOPKINS' 'SOUTHEAST MISSOURI STATE UNIVERSITY' 13.0
  '5736512217' None None 'Monday' '8:00AM' '9:00AM' 'Summer' None None None
  None '2017-12-22 10:39:30.626331' 'Completed' None '1-11KUFFZ'
  'Central Time Zone']

如果我理解正确,您希望使用以下方法:


我认为您只需要指定每个列名,并且不要忘记表必须具有id字段以对数据帧索引收费:

conn = pymssql.connect(host="Dev02", database="DEVDb")
cur = conn.cursor()
query = """INSERT INTO dbo.SCORE_TABLE(index, column1, column2, ..., column20)
            VALUES (?, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 
            %s, %s, %s, %s, %s, %s)"""
cur.executemany(query, df_sql)
conn.commit()
cur.close()
conn.close()
好的,我一直在使用熊猫,我将最后一个数据帧导出到csv,如:

df.to_csv('new_file_name.csv', sep=',', encoding='utf-8')
然后我只使用了
pyobdc
bulkinsert
Transact-SQL,比如:

import pyodbc

conn = pyodbc.connect(DRIVER='{SQL Server}', Server='server_name', Database='Database_name', trusted_connection='yes')
cur = conn.cursor()

cur.execute("""BULK INSERT table_name
               FROM 'C:\\Users\\folders path\\new_file_name.csv'
               WITH
               (
                   CODEPAGE = 'ACP',
                   FIRSTROW = 2,
                   FIELDTERMINATOR = ',',
                   ROWTERMINATOR = '\n'
               )""")
conn.commit()

cur.close()
conn.close()

这是第二次向SQL Server中收费15314行。我希望这能给你一个想法。

可能
executemany
会将
df.values
调用中
ndarray
中的每一行作为one项处理,因为值之间没有逗号分隔符。因此,占位符的数量超过实际绑定值,您将收到不匹配错误

考虑将数组转换为元组(或列表列表/列表元组/元组列表),然后将该对象传递到
executemany

query = "INTO dbo.SCORE_TABLE VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"    
sql_data = tuple(map(tuple, df.values))

cur.executemany(query, sql_data)
cur.commit()

也许这篇文章会对你有所帮助是的,我知道这一点,但我已经读到pandas
to_sql
pymssql
对于大量数据来说要慢。您认为在处理大量数据时,两种方法之间是否存在重大性能差异?我所说的大量,是指约8万到10万行和20万行columns@KrishnangKDalal考虑使用更新的问题。code>turbodbc确实是一个不错的软件包,但我仍然收到一个错误。@KrishnangKDalal。。。您是否真的尝试了
to_sql
方法并对自己进行了测试,甚至使用了SQLAlchemy引擎而不是原始连接?你听到的未必都是真的@是的,我已经测试了
到_sql
,插入26646行只需要7分钟多一点。我想比较其他方法,但为此,我必须让其他方法工作。不,我尝试将数组转换为元组元组和列表列表,但得到的是
turbodbc.exceptions.DatabaseError:参数数无效(预期为0,得到20)
error这是pymssql的,因为占位符不同。在turbodbc中尝试使用
。我认为它可以工作,但我的it团队添加了一个标识列,由于权限问题,我无法通过关闭identity\u insert来插入任何值,如果不为该列提供任何值,我将无法继续。我会接受答案,一旦我把它从我的结束。谢谢如果标识字段和dataframe中的列名称相同,请将该列放到pandas中并删除一个占位符,然后重试。标识列是数据库引擎自动插入新行而非用户的自动编号字段。是的,我尝试了此操作,但出现以下错误:
turbodbc.exceptions.DatabaseError:ODBC错误状态:IM002本机错误代码:0消息:[Microsoft][ODBC Driver Manager]未找到数据源名称且未指定默认驱动程序
。我的数据库中肯定有这个表,因为我可以使用
插入数据到_sql
感谢@virtualvid的帮助,并对迟来的确认表示抱歉。这很有效。@virtualvid:我正在尝试对我的一个项目使用您的批量插入建议,但我一直得到**操作系统找不到路径“新的_文件_name.csv。文件位于我指定的路径中。你能想到问题出在哪里吗?@KrishnangKDalal你能告诉我你在使用哪一行吗?我已经发布了关于如果数据必须进入模式“myschema”而不是“dbo”会是什么样子的?我所有的表都有一个前缀“ms_u”,但我希望它们是“myschema”。。但是,如果我用“myschema.ms”替换“ms”,所有表都是这样的:“dbo.myschema.ms”。。。