Как передать переменные в предложение IN запроса MySQL в pandas .read_sql_query? - PullRequest
0 голосов
/ 18 апреля 2020

Я пишу обобщенную c функцию для запроса базы данных, где я хочу использовать * args для получения значений. Вот функция

def get_latest_value(col_name, *args):
    query = "select * from latest_value where {column} in (%s)"
    query = query.format(**dict(column=col_name))
    results = pd.read_sql_query(query, engine, params = [args])
    return(results)

Однако, когда я запускаю это, я получаю эту ошибку:

ProgrammingError: (MySQLdb._exceptions.ProgrammingError) not all arguments converted during bytes formatting
[SQL: select * from latest_value where amfi_code in (%s)]
[parameters: (100370, 100371)]
(Background on this error at: http://sqlalche.me/e/f405)

Я даже пытался преобразовать * args в список перед его передачей, но это не тоже не поможет.

Невозможно понять, как передать значения в * args предложению IN. Любая помощь приветствуется.

Кроме того, использует ли конкатенация строк для имени столбца таким образом, безопасный от sql атак внедрения?

Обновление:

Я изменил код следующим образом:

def get_latest_value(col_name, *args):
    query = "select * from latest_value where {column} in (%s)"
    query = query.format(**dict(column=col_name))
    conditions = ", ".join(map(str, args))
    results = pd.read_sql_query(query, engine, params = [conditions])
    return(results)

Я не получаю ошибку сейчас, но я получаю результаты только для первого значения в аргументах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...