如何在python中删除元组字典中的多余逗号

时间:2019-05-22 14:09:03

标签: python-3.x dictionary tuples

我有一个元组值字典,有些元组包含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])`

,它不会给我一个错误,并且不起作用。

如果能帮助我解决问题,我将非常感激。

1 个答案:

答案 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 ()可能是语法错误),否则扩展为注射攻击媒介。