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])
Другие вопросы по тегам