python список в sql как параметр - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь передать python список целых чисел в SQL компонентах. Я уже смотрел предыдущие вопросы, но ни один из них не помог мне решить ошибку. Вот что я делаю:

import cx_Oracle
SQL_Components = '''
SELECT /*+ FIRST_ROWS materialize */
    xxx,
    xxx
FROM
    xxx
    INNER JOIN xxx
    INNER JOIN xxx
    INNER JOIN xxx
    INNER JOIN xxx
WHERE
    tpr.tpr_name LIKE 'M39AAA%' AND mml.mml_name IN (%s)
'''

def get_TPM_IDsDict():
    global chosen_lot
    chosen_lot=[]
    print ("Executing: get_TPM_IDsDict")
    f = open("XXX.txt", "r")
    for line in f:
        chosen_lot.append(line.strip())
    chosen_lot = ["'%s'" % x for x in chosen_lot]
    Cursor.execute(SQL_Components % ("','".join(chosen_lot)))

Я получаю эту ошибку:

Cursor.execute(SQL_Components % ("','".join(chosen_lot)))
ValueError: unsupported format character ''' (0x27) at index 580

1 Ответ

2 голосов
/ 21 июня 2020

Рассмотрим нумерованные параметры, которые поддерживает cxOracle. Кроме того, не забудьте передать значения параметров во втором аргументе cursor.execute. Не перезаписывайте сами ваши значения!

И во всех Python DB-API (cxOracle, ibm_db, psycopg2, pyodbc, et c.) Заполнители параметров не должны цитироваться. Кроме того, в Python обычно избегайте использования % для интерполяции строк, так как он не выделяется (официально не устарел еще ) . Вместо этого используйте str.format или F-строки (Python 3,6 +).

SQL_Components = '''
                 SELECT /*+ FIRST_ROWS materialize */
                     xxx,
                     xxx
                 FROM
                     xxx
                     INNER JOIN xxx
                     INNER JOIN xxx
                     INNER JOIN xxx
                     INNER JOIN xxx
                 WHERE
                     tpr.tpr_name LIKE 'M39AAA%' AND mml.mml_name IN ({})
                 '''
# BUILD NUMBERED PLACEDHOLERS WITH enumerate
prms = [":" + str(i+1) for i,_ in enumerate(chosen_lot)] 

# INTERPOLATE WITH str.format
Cursor.execute(SQL_Components.format(", ".join(prms)), chosen_lot)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...