繁体   English   中英

从 Python 插入 SQL Db

[英]Insert into SQL Db from Python

我希望使用以下代码将 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')

我该如何解决?

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

顺便说一句,为了更简单的多行字符串,请考虑 Python 的三引号字符串。 待办事项,因为熊猫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())

为未来的读者提供正确的答案......

根据评论,使用以下内容会更直接,也可能更有效:

  • 熊猫DataFrame.to_sql()函数
  • sqlalchemy engine对象

两者的文档都可以在这里找到:

由于此用例可能因情况而异,请参阅官方文档以获取代码示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM