python - 从 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')
我该如何解决?
解决方案
原始查询应使用正确的 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())
推荐阅读
- wso2 - WSO2 API Manager 发布者 URL 问题
- reactjs - 在另一个 Mutation 中使用 Mutation 的结果
- flutter - Flutter MultiProvider 或 ChangeNotifier 没有响应
- tensorflow - 根据模型预测过滤 Tensorflow 数据集
- tensorflow - 将 npz jax 权重转换为 keras h5 权重
- python - 为什么在从另一个具有相同形状的 numpy 数组添加元素后,numpy 数组的形状会扭曲?
- php - 是否可以将 USSD 与 html 一起使用?
- python - 如何使用 pyplot 为两个数据类创建散点图?
- javascript - RxJS:takeUntil 忽略主题事件
- laravel - 在 alpine 中渲染一个雄辩的模型?