Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python插入SQL数据库_Python_Sql Server - Fatal编程技术网

从Python插入SQL数据库

从Python插入SQL数据库,python,sql-server,Python,Sql Server,我希望使用以下代码将python数据帧插入MSSQL表: conn=pyodbc.connect('Driver={odbcdriver 17 for SQL Server}\ Server=esql.ecs.local\ 数据库=drgt\ 受信任的_连接=是;') 游标=连接游标()#创建游标 对于范围(0,t6.形状[0])中的行数: chunk=t6.iloc[行计数:行计数+1,:].values.tolist() tuple\u of_tuples=tuple(tuple(x)表示块

我希望使用以下代码将python数据帧插入MSSQL表:

conn=pyodbc.connect('Driver={odbcdriver 17 for SQL Server}\
Server=esql.ecs.local\
数据库=drgt\
受信任的_连接=是;')
游标=连接游标()#创建游标
对于范围(0,t6.形状[0])中的行数:
chunk=t6.iloc[行计数:行计数+1,:].values.tolist()
tuple\u of_tuples=tuple(tuple(x)表示块中的x)
cursor.executemany(“插入到DWWorking.dbo.api_Nic_数据”+”([a]、[b]、[c]、[d]、[e]、[f]\
[g] ,[h],[i],[j],[k],[l],[m],[n]\
[o] ,[p],[q],[r],[s],[t],[u],[v]\
[w] ,[x],[y],[z],[ab],[cd]\
[ef]、[gh]、[ij]、[kl]])\
数值(,
元组(元组中的元组)
光标被打开,我检查表是否存在,是否有所需的列。 执行时,我仍然收到以下错误:

编程错误:(“SQL包含0个参数标记,但提供了33个参数”,“HY000”)


如何解决?

为未来读者提供正确答案

在评论之后,使用以下内容可能更直接、更有效:

  • pandas
    DataFrame.to_sql()
    函数
  • sqlalchemy
    引擎
    对象
可在此处找到这两个方面的文档:


由于不同情况下的用例可能会有很大差异,请参考官方文档中的代码示例。

原始查询应使用适当的SQL,该SQL没有括号括住插入列列表中的
。此外,
executemany
不应要求在数据帧行之间进行任何
循环,并且可以比
df.to\u sql
更快。此外,表和列标识符不应使用单引号

顺便说一下,对于更简单的多行字符串,请考虑Python的三重引用字符串。请注意,由于Pandas v0.24,建议使用
.to\u numpy
方法而不是
.values
(请参阅)。下面假设数据框正好包含32列,每个列映射到相应的表列

sql=“”插入到DWWorking.dbo.api_Nic_数据中
([a]、[b]、[c]、[d]、[e]、[f]、[g]、[h]、[i]、[j],
[k] ,[l],[m],[n],[o],[p],[q],[r],[s],[t],
[u] ,[v][w],[x],[y],[z],[ab],[cd],[ef],[gh],[ij],[kl])
值(?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?)
""" 
cursor.executemany(sql,t6.to_numpy().tolist())

为什么不使用
sqlalchemy
引擎
df.to_sql()
?当然更简单,更有效率。和@S3DEV-使用以下代码也尝试过:t6.to_sql(api_nic_数据,引擎,index=False,如果_exists=“append”,schema=“dbo”),错误表明未定义名称api_nic_数据。这是表名,它肯定存在于存储中。甚至
“DWWorking.dbo.api\u Nic\u Data”
?我会继续努力的,你走对了。TBH我不确定熊猫要找多少这个桌子名;(我不惜一切代价避免MSSQL)。但同样,您的思路是正确的。@S3DEV-原来我在上面的代码中缺少了表名的单引号。这修复了第一个错误,但现在我看到了:InterfaceError:(pyodbc.InterfaceError)('IM002','[IM002][Microsoft][ODBC Driver Manager]未找到数据源名称,并且未指定默认驱动程序(0)(SQLDriverConnect);[IM002][Microsoft][ODBC Driver Manager]无效的连接字符串属性(0);[IM002][Microsoft][ODBC ODBC Driver Manager]此错误的背景位于:),很高兴这有帮助。我建议提出一个新问题,并提供用于为
df.to\u sql()
创建sqlalchemy引擎的连接字符串的(经过清理的)详细信息。