При использовании таких примитивных типов, как 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
.
Однако, при попытке использовать аналогичный подход для передачи списка / кортежа идентификаторов, я всегда выдаю ошибку синтаксиса 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 намного сложнее, этот здесь упрощениев качестве иллюстрации
- в крайнем случае - я мог бы изменить SQL в Python на основе аргумента, но я действительно хотел бы избежать этого.)