Python CX_Oracle: как использовать возвращенные кортежи в другом запросе - PullRequest
0 голосов
/ 17 октября 2018

Я использую 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')

У меня возникают проблемы с тем, чтобы разобранный необработанный запрос выглядел как второй пример, хотя я не уверен в том, как интерпретируются типы данных Python (я предполагаю, что мой 1-й пример даже не является правильной интерпретацией того, чтонеобработанный SQL выглядит так:

ОБНОВЛЕНИЕ: поэтому я думаю, что вы должны быть в состоянии сделать это, используя: cursor.executemany(base_query, [('R100',), ('R200',)]) Но я получаю ошибку: cx_Oracle.DatabaseError: DPI-1013: not supported Я на cx_oracle Ver 7.0.0 пытаюсь выяснить какая версия моей БД сейчас

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Понял.Отправка здесь для всех, кто делает это.По сути, вы должны динамически генерировать 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)
0 голосов
/ 17 октября 2018

Вы можете использовать эту функцию для преобразования формата, а затем использовать его в своем запросе.

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