在sqlalchemy/psycopg2中使用整数的IN子句

13 投票
7 回答
6151 浏览
提问于 2025-04-15 15:20

我刚开始学习python和postgres的组合,所以如果这个问题很简单,请多包涵。我正在用sqlalchemy执行一个原始的SQL查询,类似于:

SELECT * FROM table WHERE pk_table_id IN ()

在下面的例子中,我尝试使用self.ids,它是一个包含字符串或整数的元组,还有一个包含字符串或整数的数组。无论哪种方式都没有成功。

当我使用这一行时:

my_connection.execute('SELECT * FROM public.table WHERE pk_table_id IN (%s)', self.ids)

我遇到了这个错误:

TypeError: not all arguments converted during string formatting

有什么建议吗?

7 个回答

2

execute中,%s这个占位符期待的是一个单一的值,而不是一组值(元组)。你要么把它换成','.join(('%s',) * len(mytuple)),要么用字符串替换的方式来处理!

9

你可以使用 cur.mogrify 这个方法:

cur = my_connection.cursor()
cur.execute(cur.mogrify('SELECT * FROM public.table WHERE pk_table_id IN %s', (tuple(self.ids),)))
10

我最后放弃了SqlAlchemy,直接用了psycopg2,所以我不确定这是否完全适用。我发现,如果你传给psycopg2一个元组而不是数组或列表,它会正确处理IN语句。我传了一个整数的元组,结果一切都正常。

撰写回答