首页 > 解决方案 > 从 Python 插入 SQL Db

问题描述

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

conn = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};\
                       Server=esql.ecs.local;\
                       Database=drgt;\
                       Trusted_Connection=yes;')
cursor = conn.cursor()  #Create cursor


for row_count in range(0, t6.shape[0]):
    chunk = t6.iloc[row_count:row_count+1,:].values.tolist()
    tuple_of_tuples = tuple(tuple(x) for x in chunk)
    cursor.executemany("insert into DWWorking.dbo.api_Nic_Data"+"([[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]])\
                                                        values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
                                                                    tuple_of_tuples)

游标已打开,我检查了该表是否存在并具有所需的列。执行时我仍然收到以下错误:

ProgrammingError: ('SQL 包含 0 个参数标记,但提供了 33 个参数', 'HY000')

我该如何解决?

标签: pythonsql-server

解决方案


原始查询应使用正确的 SQL,该 SQL 不使用括号括住INSERT INTO列列表。此外,executemany应该不需要for跨数据框行的任何循环,并且可以比df.to_sql. 此外,表和列标识符不应使用单引号。

顺便说一句,对于更简单的多行字符串,请考虑 Python 的三引号字符串。请注意,由于 Pandas v0.24.to_numpy是推荐的方法.values(请参阅文档)。下面假设数据框正好包含 32 列,每列都映射到相应的表列。

sql = """INSERT INTO DWWorking.dbo.api_Nic_Data 
            ([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])
         VALUES (?,?,?,?,?,?,?,?,?,?,
                 ?,?,?,?,?,?,?,?,?,?,
                 ?,?,?,?,?,?,?,?,?,?,?,?)
      """ 

cursor.executemany(sql, t6.to_numpy().tolist())

推荐阅读