我有一个元组值字典,有些元组包含1个元素的元组,有些元组具有多个元素的元组,我想将每个元组从字典传递给Oracle SQL查询并执行一些操作。但是,不幸的是,1元素元组在末尾生成一个额外的逗号,只是为了区分列表和python中的元组,这很烦人。
我的元组字典如下:
orderid_dict =
`{foo : (121, 122, 123, 124),
bar : (221,),
zoo : (331, 332),
xyz : (441,442,443, 444, 445,446),
abc : (551,)}`
`
dfs=[]
for x in orderid_dict:
query = """select * from table where order_id in
"""+str(orderid_dict[x])
df=pd.read_sql_query(query, conn)
dfs.append(df)`
当我执行此循环时,它抛出一条错误消息:
数据库错误:在SQL'select * from table(221,)中的order_id'中执行失败:ORA-00936:缺少表达式
是否可以删除字典中所有1元素元组的最后一个逗号?
我尝试使用:
`for x in orderid_dict:
",".join(str(x) for x in orderid_dict[x])`
,它不会给我一个错误,并且不起作用。
如果能帮助我解决问题,我将非常感激。
答案 0 :(得分:1)
我强烈建议不要尝试将输入片段直接粘贴到SQL字符串中。而是使用后期绑定:
inputs = (1,2,3,)
sql = """SELECT *
FROM table
WHERE order_id IN (%s)
""" % (",".join(["?"]*len(inputs)), )
pd.read_sql_query(sql, conn, params=inputs)
这里发生的是根据参数数量将SQL字符串扩展为... IN (?, ?, ?, ?, ...)
。然后,实际参数通过驱动程序传递。
这不仅在所有情况下都有效(除非inputs
为空,具体取决于您的sql引擎WHERE ... IN ()
可能是语法错误),否则扩展为注射攻击媒介。