我正在使用cx_Oracle通过Python查询我的数据库。我有一个查询,返回多个结果。在cx_Oracle中,对返回多个结果的查询使用.fetchall()命令,将每一行放入一个元组,然后创建一个元组列表(每返回一行1个)。 提取查询结果后,其格式如下:
[('R100',), ('R200',)]
我现在想在另一个查询中使用这些结果。下一个查询如下:
base_query = "select MODEL from USER.TABLE where SERIES in :series"
其中:series
是一个特殊的参数标记,可以在执行如下查询时替换:
cursor.execute(base_query, series=[('R100',), ('R200',)])
当我尝试将序列设置为元组列表时,出现此错误:
cx_Oracle.NotSupportedError: element 0 value is unsupported
我知道这可能是语法问题,因为在原始SQL中,我试图创建的查询可能是这样的:
base_query = "select MODEL from USER.TABLE where SERIES in [('R100',), ('R200',)]"
这是我真正想要的时间:
base_query = "select MODEL from USER.TABLE where SERIES in ('R100','R200')
尽管我不确定解析的数据类型是如何解释的,但我无法使解析后的原始查询看起来像第二个示例(我想我的第一个示例甚至不能正确解释原始SQL的内容)看起来像)
更新:
因此,我认为您应该可以通过以下方式使用此功能:
cursor.executemany(base_query, [('R100',), ('R200',)])
但我收到一个错误:cx_Oracle.DatabaseError: DPI-1013: not supported
我正在使用cx_oracle Ver 7.0.0,试图确定我的数据库现在是哪个版本
答案 0 :(得分:1)
您可以使用此功能转换格式,然后在查询中使用它。
def to_tuple(first_output):
series = []
for py_tuple in first_output:
series.append(py_tuple[0])
return tuple(series)
series = to_tuple(first_output) # Output : ('R100', 'R200')
query = "select MODEL from USER.TABLE where SERIES in {}".format(series)
#Output:"select MODEL from USER.TABLE where SERIES in ('R100', 'R200')"
答案 1 :(得分:0)
知道了。在这里张贴给其他这样做的人。基本上,您必须动态生成n个查询参数,然后将元组列表转换为字符串列表。
# var series is what you will get from a query that returns multiple results
print(series) # >> [('R100',), ('R200',)]
tuple_list_to_str_list = [str(i[0]) for i in results['series']]
print(tuple_list_to_str_list) # >> ['R100', 'R200']
vars_list = ','.join(':%d' % i for i in range(len(results['series'])))
print(vars_list) # Makes n number of query params >> :0,:1
base_query = "select MODEL from USER.TABLE where SERIES in (%s)" % vars_list # Base query
print(base_query) # select MODEL from USER.TABLE where SERIES in (:0,:1)
cursor.execute(base_query, tuple_list_to_str_list)