У меня есть оператор SQL, SELECT foo FROM bar WHERE id IN %s
. У меня есть список целых чисел, например. [1, 2, 3]
, и я хотел бы, чтобы это превратилось в инструкцию SQL, которая выглядит как SELECT foo FROM bar WHERE id IN (1, 2, 3)
.
Я использую SQLAlchemy Core для его пула соединений и для создания некоторых вставк с несколькими кластерами VALUES
легче писать и поддерживать. Я предпочитаю писать большинство моих запросов в сыром SQL.
Чтобы сделать это в Pyscopg2, я делаю cursor.execute('SELECT .. WHERE IN %s', (tuple(my_list),))
. Однако я не могу выполнить эту работу в SQLAlchemy.
engine.execute('SELECT ... WHERE IN %s', tuple(my_list))
вызывает исключение: TypeError: не все аргументы, преобразованные во время форматирования строки. Это же исключение возникает, если я передаю только список, а не завернутый в кортеж.
Если я использую именованные параметры, такие как engine.execute('SELECT ... WHERE id IN :ids', ids=my_list)
, я получаю исключение ProgrammingError
, потому что SQLAlchemy создает неправильный SQL: SELECT * FROM foo WHERE id IN :ids
(он не заменяет значение: ids для моей переменной). Это же исключение возникает, если я передаю кортеж.
Как я могу использовать предложение WHERE IN()
, используя raw SQL в SQLAlchemy?