我有一条 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 的子句?