sqlalche/psycopg2中带有整数的IN子句

Sco*_*CSD 8 python sql postgresql

只是初学者使用python/postgres组合,请原谅我,如果这是微不足道的.我正在使用sqlalchemy执行原始SQL查询:

SELECT * FROM table WHERE pk_table_id IN ()
Run Code Online (Sandbox Code Playgroud)

对于下面的示例,我尝试self.ids了包含字符串或整数的元组以及包含字符串或整数的数组.无论哪种方式,它都无法正常工作.

当我使用这一行时:

my_connection.execute('SELECT * FROM public.table WHERE pk_table_id IN (%s)', self.ids)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Pyk*_*ler 7

您可以使用cur.mogrify方法:

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


Sco*_*CSD 6

我最终放弃了SqlAlchemy直接psycopg2,所以我不知道它是否适用100%.我发现如果你传递一个元组而不是一个数组/列表,psycopg2将正确编译IN子句.我通过了一个整数元组,它运行得很好.


Ale*_*lli 2

%s中的占位符需要execute标量,而不是元组。您需要将其替换为','.join(('%s',) * len(mytuple)),或者使用字符串替换!