Python Cx_Oracle; 如何使用列表作为参数执行 SQL 插入

德鲁·阿申布雷纳

我生成了一个 ID 号列表。我想执行一个插入语句,从一个表中获取 ID 值在我的列表中的所有记录,并将这些记录插入到另一个表中。

我发现了这个 cx_Oracle 函数,而不是运行多个执行语句(据我所知是可能的),它可以用单个语句和列表参数执行所有内容。(它还避免了在传入参数之前对 SQL 语句进行笨重的格式设置)但我认为我需要在将其作为参数传入之前更改我的列表。只是不确定如何。

我参考了这个网页:https : //dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-executemany.html

ids = getIDs()
print(ids)

[('12345',),('24567',),('78945',),('65423',)]

sql = """insert into scheme.newtable
     select id, data1, data2, data3
     from scheme.oldtable
      where id in (%s)"""
cursor.prepare(sql)
cursor.executemany(None, ids)

我希望 SQL 语句执行如下:

插入scheme.newtable select id, data1, data2, data3 from scheme.oldtable where id in ('12345','24567','78945','65423')

相反,我收到以下错误:ORA-01036:非法变量名称/编号

编辑:我发现了这个 StackOverflow:如何使用 Python 批量插入 Oracle 数据库?我更新了我的代码以事先准备好语句并将列表项更新为元组,但我仍然遇到相同的错误。

克里斯托弗·琼斯

executemany()用于批处理 DML,例如,当您想将大量值插入表中作为运行多个插入语句的有效等效项时。https://blogs.oracle.com/opal/efficient-and-scalable-batch-statement-execution-in-python-cx_oracle 中讨论了 cx_Oracle 示例

但是你在做什么

insert into scheme.newtable
     select id, data1, data2, data3
     from scheme.oldtable
      where id in (%s)

是另一回事 - 您正在尝试使用 IN 子句中的多个值执行一个 INSERT 语句。您将为此使用法线execute()

由于 Oracle 保持与 SQL 不同的绑定数据,您不能将多个值传递给单个绑定参数,因为数据被视为单个 SQL 实体,而不是值列表。您可以使用%s现有的字符串替换语法,但这对 SQL 注入攻击是开放的。

Oracle 语言接口有多种通用技术,请参阅https://oracle.github.io/node-oracledb/doc/api.html#sqlwherein,了解可以重写为 Python 语法的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Python设置cx_Oracle环境变量

Python cx_oracle绑定变量和项目列表

如何在Python中模拟cx_Oracle游标

如何通过熊猫数据帧在cx_Oracle中使用命名绑定和批量插入(executemany)

python正则表达式来提取和替换查询参数-cx_oracle要求

如何使用python,cx_oracle将查询的结果集提取为字典?

将cx_Oracle与IN语句一起使用(Python 3)

Python CX_Oracle:如何在另一个查询中使用返回的元组

使用cx_Oracle包从python环境执行的Oracle SQL查询中获取动态日期

将Python字典用于CX_ORACLE的SQL INSERT语句

如何修复Python cx_Oracle中的'ORA-19011'错误

如何使用cx_oracle执行SQL脚本

使用python连接到Oracle数据库(cx_oracle)

CX_Oracle使用绑定变量/函数插入数据并返回记录ID

使用Python和cx_Oracle是否可以进行空间查询?

对于cx_Oracle,在Python中将日期绑定到SQL

数据库:使用cx_oracle通过python检查数据类型

使用python cx_oracle将数据导入到oracle

如何在假脱机中使用python cx_Oracle

Python 使用 cx_Oracle 在 Oracle BD 中导入/插入 CSV(无标题)

CX_Oracle CTE 执行

使用 cx_Oracle 将完整的 python 列表推送到 oracle db

使用 cx_Oracle executemany() 从 Python 列表/字典批量插入 Oracle 数据库

使用 cx_Oracle Cursor.executemany() 插入序列的下一个值

Python Cx_Oracle 选择查询绑定带有 WHERE IN 子句的元组列表

使用 cx_Oracle for Python 并接收 TypeError: 'NoneType' object is not iterable when insert data to table

使用 cx_Oracle + Python 从另一个所有者访问表

python cx_Oracle 查询结束

如何获取 DDL 命令 Python cx_oracle 的输出