当使用 Integer 等原始类型时,我可以毫无问题地进行如下查询:
with connection.cursor() as cursor:
cursor.execute(sql='''SELECT count(*) FROM account
WHERE %(pk)s ISNULL OR id %(pk)s''', params={'pk': 1})
如果参数等于 ,id = 1
它将返回行或返回所有行。pk
None
但是,当尝试使用类似的方法来传递ID列表/元组时,我总是在传递空/无元组时产生 SQL 语法错误,例如尝试:
with connection.cursor() as cursor:
cursor.execute(sql='''SELECT count(*) FROM account
WHERE %(ids)s ISNULL OR id IN %(ids)s''', params={'ids': (1,2,3)})
有效,但传递()
会产生 SQL 语法错误:
psycopg2.ProgrammingError: syntax error at or near ")"
LINE 1: SELECT count(*) FROM account WHERE () ISNULL OR id IN ()
或者,如果我通过了None
,我会得到:
django.db.utils.ProgrammingError: syntax error at or near "NULL"
LINE 1: ...LECT count(*) FROM account WHERE NULL ISNULL OR id IN NULL
我尝试将参数放在 SQL 中()
-(%(ids)s)
但这总是会破坏一个或另一个条件。我也尝试过玩弄pg_typeof
或抛出论点,但没有结果。
笔记:
- 实际的 SQL 要复杂得多,这里的这个是为了说明目的而进行的简化
- 作为最后的手段 - 我可以根据参数更改 Python 中的 SQL,但我真的想避免这种情况。)