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

Python CX_Oracle:如何在另一个查询中使用返回的元组,python,cx-oracle,Python,Cx Oracle,我正在使用cx_Oracle使用Python查询我的数据库。我有一个返回多个结果的查询。在cx_Oracle中,对返回多个结果的查询使用.fetchall()命令将每一行放入一个元组,然后生成一个元组列表(每返回一行1个)。 获取查询结果后,其格式如下: [('R100',),('R200',)] 我现在想在另一个查询中使用这些结果。下一个查询如下: base\u query=“从USER.TABLE中选择模型,其中SERIES在:SERIES中” 其中:series是一个特殊的参数标记,在执行

我正在使用cx_Oracle使用Python查询我的数据库。我有一个返回多个结果的查询。在cx_Oracle中,对返回多个结果的查询使用.fetchall()命令将每一行放入一个元组,然后生成一个元组列表(每返回一行1个)。 获取查询结果后,其格式如下:

[('R100',),('R200',)]

我现在想在另一个查询中使用这些结果。下一个查询如下:

base\u query=“从USER.TABLE中选择模型,其中SERIES在:SERIES中”

其中
:series
是一个特殊的参数标记,在执行如下查询时可以替换:

cursor.execute(基本查询,系列=[('R100',),('R200',)]))

当我尝试将序列设置为元组列表时,会出现以下错误:

cx\U Oracle.NotSupportedError:不支持元素0值

我知道这可能是一个语法问题,因为在原始SQL中,我尝试创建的查询可能如下所示:

base\u query=“从USER.TABLE中选择模型,其中系列位于[('R100',),('R200',)]”中

我真正想要的是:

base\u query=“从USER.TABLE中选择模型,其中序列位于('R100','R200')

但是,我很难让解析后的原始查询看起来像第二个示例,因为我不确定python数据类型是如何被解释的(我猜我的第一个示例甚至不是对原始SQL的正确解释)

更新: 所以我认为你应该能够通过以下方式做到这一点:
cursor.executemany(基本查询,[('R100',),('R200',)])
但是我得到一个错误:
cx\U Oracle.DatabaseError:DPI-1013:不支持

我使用的是cx_oracle 7.0.0版,试图找出my DB现在的版本

您可以使用此函数转换格式,然后在查询中使用它

    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')"

明白了。发布给其他人。基本上,你必须动态生成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)

我认为这会起作用,但显然,即使返回的是元组,Oracle也不希望您在查询中使用这些元组。我尝试使用该方法的输出:
('R100','R200')
,但出现了以下错误:
不支持tuple类型的Python值。
将元组设置为string
str(series)
也不起作用,即使
str(series)
输出为我认为需要的确切字符串('R100','R200')
我不知道为什么不起作用,因为对整个查询进行硬编码:
从USER.TABLE中选择MODEL,其中series in('R100','R200'))
哦,这可能是因为cx_Oracle将其解释为
”('R100','R200')”
而不是
('R100',R200”)
我认为最好将查询修改为嵌套查询。query=“select MODEL from USER.TABLE where SERIES IN”(“在此处编写第一个返回序列的查询”)。这样你就可以摆脱额外的格式。按照目前的想法,也许Oracle正在寻找类似的东西。。抱歉,我无法运行它,因为我没有Oracle数据库。query=“从USER.TABLE中选择模型,其中系列采用({},{}')。格式(系列[0],系列[1])。这不是一个好方法,因为该系列可以是任意长度的