在sqlalchemy/psycopg2中使用整数的IN子句
我刚开始学习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语句。我传了一个整数的元组,结果一切都正常。