PL/Python. Как использовать тип None, где clouse для целого числа?
Итак, у меня такой же запрос, как показано ниже:
query = plpy.prepare(
"SELECT count(id) FROM contracts WHERE dependent_id = $1",
["integer"])
params = [dependent_id]
plpy.execute(query, params)
Если мое поле dependent_id
не None
, это работает хорошо. Но если у меня есть None
в этом поле запрос работает некорректно. Так как =
не то же самое, что IS
когда вы сравниваете с NULL
Я пытался использовать выражение if-else для исправления строки запроса, но когда запрос содержит IS
Я ловлю исключение синтаксиса.
После того, как я зарегистрировал свой запрос с IS
ключевое слово (когда мое поле None
), Я выполнил его в оболочке PSQL, и он работал хорошо.
Итак, почему IS
не работает на plpythonu
хранимая процедура, но все еще работает на нативный запрос SQL?
ОБНОВИТЬ:
У меня было обсуждение с DBA на моей работе, и он думает, что это ошибка в plpythonu
с преобразованием типов. Так как plpy.execute
возрастающее исключение, когда мы пытаемся использовать IS
с целочисленным типом.
После того как вы объявили поле как целое и использовали IS
в запросе на этапе подготовки вы получите синтаксическое исключение на этапе выполнения.
Обходной путь - строка запроса с очевидным указанием вашего None
поле как IS NULL
или же IS NOT NULL
PS Извините за мой английский.
1 ответ
Вы можете попытаться подготовить два отдельных оператора SQL для динамической типизации Python:
query = plpy.prepare("SELECT count(id) FROM contracts WHERE dependent_id = $1", ["integer"]) if dependant_id is not None else plpy.prepare("SELECT count(id) FROM contracts WHERE dependent_id IS NULL", [])
if dependant_id is None:
plpy.execute(query, [])
else:
plpy.execute(query, [dependant_id])