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

Python CX_Oracle: How to use returned tuples in another query

我正在使用 cx_Oracle 通过 Python 查询我的数据库。我有一个 returns 多个结果的查询。在 cx_Oracle 中,对 returns 多个结果的查询使用 .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')

我无法使解析后的原始查询看起来像第二个示例,因为我不确定如何解释 python 数据类型(我猜我的第一个示例甚至都不正确原始 SQL 的解释)

更新: 所以我认为你应该能够通过这样做来做到这一点: cursor.executemany(base_query, [('R100',), ('R200',)]) 但我收到一个错误:cx_Oracle.DatabaseError: DPI-1013: not supported 我正在使用 cx_oracle Ver 7.0.0 试图弄清楚我的数据库现在是什么版本

您可以使用此功能转换格式,然后在您的查询中使用它。

    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)