Как правильно передавать массивы из Django / Python в Postgres / PLPGSQL, хранимый параметр переменной variadic - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь вызвать хранимый процесс на Postgres / PLPGSQL из Django / Python.У меня есть сохраненный процесс, определенный с помощью параметра VARIADIC:

CREATE OR REPLACE FUNCTION udf_getmultiplecategoriescodetypes (VARIADIC NUMERIC[])

, тогда единственное место, где я хочу использовать массив параметров в процессе, - это WHERE stmt:

WHERE cct.code_category_fk_id = ANY($1)

Все это прекрасно работает, когда я вызываю функцию из консоли DBeaver:

SELECT * FROM udf_getmultiplecategoriescodetypes(1, 2)

Однако, если я использую функцию callproc в Django / Python, использую синтаксис того же типа, например:

c.callproc("udf_getmultpilecategoriescodetypes", (1, 2))

Я получаю ошибки:

LINE 1: SELECT * FROM udf_getmultpilecategoriescodetypes(1,2)
HINT:  No function matches the given name and argument types. You might need to add
explicit type casts.

function udf_getmultpilecategoriescodetypes(integer, integer) does not exist

Кроме того, в DBeaver, когда функция создается и сохраняется в списке функций, если я пытаюсь удалить ее, она говорит, что функция не найдена.

Отображение функции в TreeView

Ошибка удаления Msg

С тех пор я обнаружил, что могу удалить его с помощьюDROP FUNCTION, включая параметр VARIADIC, чтобы он распознавал его по количеству и типу параметров.Но почему это так?

Итак, два вопроса:

  1. Как правильно передать массив целых чисел из функции callproc Django / Python в параметр VARIADIC вхранимый протокол Postgres / PLPGSQL?
  2. Почему DBeaver не распознает перечисленную сохраненную функцию proc как существующую, когда в качестве параметра используется массив или VARIADIC?И может ли это как-то быть связано с ошибкой callproc, поскольку ошибки обеих проблем, похоже, связаны с параметром VARIADIC?

1 Ответ

0 голосов
/ 04 февраля 2019
  1. Как правильно передать массив целых чисел из функции callproc Django / Python в параметр VARIADIC в хранимом процессе Postgres / PGPLSQL?

Вы определили параметр как VARIADIC NUMERIC[], поэтому вы действительно хотите передать массив numeric, а не массив для целого числа .

И так какVARIADIC функция, вы можете передать список из numeric значений вместо фактического массива - как вы делаете.См .:

Но проблема не в этом.Postgres разрешение типа функции вернется к func(numeric[]), если нет func(int[]).Кажется, это просто опечатка .Видите ли вы разницу?

udf_getmultiplecategoriescodetypes
<strike>udf_getmultpilecategoriescodetypes</strike>

Краткие имена и, возможно, некоторые подчеркивания могут помочь предотвратить такие опечатки.

Почему DBeaver не распознает перечисленную сохраненную функцию proc как существующую, когда в качестве параметра используется массив или VARIADIC?И может ли это как-то быть связано с ошибкой callproc, поскольку ошибки обеих проблем, по-видимому, связаны с параметром VARIADIC?

Postgres допускает перегрузку функции .Следовательно, сигнатура функции состоит из ее имен и параметров, которые должны быть однозначными.DBeaver не имеет к этому никакого отношения.

Кроме того, имейте в виду, что одна и та же функция может существовать в нескольких схемах.Поэтому убедитесь, что вы работаете с правым search_path и не имеете (и случайно вызываете) копию в другой схеме.

Поэтому попытка отбросить функцию public.udf_getmultiplecategoriescodetypes() не удаласьиз-за отсутствующего параметра.И может также завершиться ошибкой, если функция была создана в другой схеме.

Связано:

...