Список пропусков как параметр запроса [duplicate]

0

Есть ли способ передать список python в качестве параметра подготовленного оператора в pymysql?

list_id = [1,2,3]
sql = "select * from table where id in (%s)"
cursor.execute(sql,(list_id,))
  • 0
    Нет. Нет способа сделать это ... передать набор (список) значений в один заполнитель привязки. Подготовленные значения связывания операторов являются скалярными значениями. Невозможно передать синтаксис, который будет интерпретироваться как SQL. Чтобы выполнить это подготовленный оператор с заполнителями связывания, текст SQL должен быть « SELECT * FROM table WHERE id IN (?,?,?) », Отдельным знаком вопроса для каждого значения. Мы могли бы написать код для подсчета количества значений в списке, а затем динамически сгенерировать оператор SQL с необходимым количеством заполнителей.
  • 0
    @spencer7593 spencer7593 Я думаю, что это точная техника, объясненная в ответе на связанный вопрос
Теги:
pymysql

3 ответа

1

Я бы сделал это так.

list_id = [1,2,3]
sql = "select * from table where id in ({})".format(",".join([str(i) for i in list_id]))
print(sql)

Out[]: "select * from table where id in (1,2,3)"

Если вам нужен альтернативный способ выполнения выполнения, вот еще одна ссылка на выполнение большого количества курсоров через библиотеку pyodbc. Надеюсь, поможет.

cursor.executemany

executemany (sql, * params)

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

params = [('A', 1), ('B', 2)] executemany ("insert into t (name, id) values (?,?)", params) Это будет выполнять инструкцию SQL дважды, один раз с ('A', 1) и один раз ('B', 2).

  • 0
    Это не то, о чем просил ОП. Они хотели один запрос, который может использовать IN а затем предоставить список.
  • 0
    Да, со второй мысли я понял, что я не в теме; p, поэтому я изменил ответ. Спасибо за напоминание
Показать ещё 2 комментария
0

если ваш список будет иметь только целые числа, тогда вам придется объединить их с символом "," и передать как строку.

0
list_id = [1,2,3]
# not working:
list_str = ', '.join(list_id)
# most likely:
list_str = ', '.join(map(str, list_id))

Но гораздо лучший способ предотвратить создание сумасшедших заявлений - https://www.python.org/dev/peps/pep-0249/#paramstyle или, как упоминалось в двойном ответе выше. )

  • 1
    это не работает
  • 0
    pymysql не принимает строку с разделителями-запятыми
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню