我有一条 SQL 语句,SELECT foo FROM bar WHERE id IN %s
. 我有一个整数列表,例如[1, 2, 3]
,我希望它变成一个看起来像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()
在 SQLAlchemy 中使用原始 SQL 的子句?