我可以在for循环SQL查询中使用Python列表吗?
问题描述:
我打算遍历一个列表(或字典,其他数据类型,如果适用的话)将每个元素作为参数传递给查询,以减少每个项目的数据库读取时间(< 1500)我想作为参数传递给查询。我可以在for循环SQL查询中使用Python列表吗?
我无法解决cx_Oracle以外的非法变量名称/数字问题。我已经尝试了几种不同的数据类型,甚至在for循环中将其清理为一个字符串(在下面的注释中),但每个都向我返回相同的错误。
有没有办法做到这一点,而不使用IN sql操作符(这是限制在我的数据库版本的1000个参数)?我是否错过了一个能够更有效地做这种事情的模块?
下面的代码会导致以下错误:
cur2.execute(SQL2, param) cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number
这就是我工作的伪代码:
#!/usr/bin/python
import cx_Oracle
ip = 'my.ip'
port = 1521
SID = 'ORADB'
dsn_tns = cx_Oracle.makedsn(ip, port, SID)
conn1 = cx_Oracle.connect('un','pw', dsn_tns)
conn2 = cx_Oracle.connect('un2/[email protected]/target')
SQL = "SELECT DISTINCT PARAM FROM TABLE"
if conn1:
cur = conn1.cursor()
cur.execute(SQL)
res = cur.fetchall()
if conn2:
SQL2 = "SELECT * FROM LARGE_TABLE WHERE COLUMN LIKE '%:paramstr%'"
realparamlist = list(res)
cur2 = conn2.cursor()
for param in realparamlist:
#eqpstr=str(param)
#eqpstr=eqpstr.strip('(').strip(')').strip(',').strip('\'')
#cur2.execute(SQL2, eqpstr)
cur2.execute(SQL2, param)
res2 = cur2.fetchall()
print res2
#todo other things with res2 and res
cur.close()
cur2.close()
conn1.close()
conn2.close()
答
您的查询应该是这样的,而不是:
SQL2 = "SELECT * FROM LARGE_TABLE WHERE COLUMN LIKE '%' || :paramstr || '%'"
请注意,无法在引号内找到绑定变量名称。 Oracle会将它视为一个字符串,而不是一个绑定变量!
其次,您的参数列表将是一元组列表,这不是您想要的。相反,你应该做这样的事情,这将解开那些一个元组到值的简单列表:
realparamlist = [p for p, in res]
最后,在第二光标执行,你需要这样的事情,而不是:
cur2.execute(SQL2, paramstr = param)
希望让你走!