asyncpg SELECT WHERE IN 给出 postgresSyntaxError

jam*_*123 0 python postgresql psycopg2 asyncpg

在我使用 asyncpg 的 python 代码中,我将元组 ('PENDING',) 传递到 where-in 查询中,该查询记录为:

args=('TYPE_1', ('PENDING',))

query=SELECT * FROM actions where type = $1 AND status IN $2
Run Code Online (Sandbox Code Playgroud)

似乎 sql 查询最终应该是

SELECT * FROM actions where type = TYPE_1 AND status in ('PENDING',);
Run Code Online (Sandbox Code Playgroud)

但上面的代码导致:

asyncpg.exceptions.PostgresSyntaxError: syntax error at or near "$2"
Run Code Online (Sandbox Code Playgroud)

我认为这可能是因为元组中的尾随逗号,但我不知道如何摆脱它..

jam*_*123 7

如果这可以帮助其他人。在 asyncpg 中,不再支持 WHERE IN。正确的方法是使用ANY,因此,在生成sql代码时,应该是:

WHERE type = $1 AND status = ANY($2::text[]) 
Run Code Online (Sandbox Code Playgroud)

其中 $2 是常规 python 列表。看了一下args,现在是:

('TYPE_1', ['PENDING'])
Run Code Online (Sandbox Code Playgroud)

  • 好,知道了。我们可以做类似 **status <> ALL($2::text[])** 的事情,即对于负面情况,将 **ANY** 替换为 **ALL** :) (2认同)
  • 换句话说,“status NOT IN $2”将是“status != ALL($2::text[])”。 (2认同)