типы параметров запроса psycopg2 - PullRequest
4 голосов
/ 26 марта 2012

У меня есть скрипт на python, который вызывает процедуру postgresql с использованием psycopg2. У proc есть следующая подпись.

CREATE FUNCTION utility_function(p_id_file bigint, p_size bigint, p_id_volume smallint, p_id_type_file bigint, p_id_user bigint) RETURNS void

Когда я вызываю его с помощью следующего кода, я получаю эту ошибку ...

Traceback (most recent call last):
  File "/tmp/regenerate/regenerate.py", line 173, in <module>
    execute_process(db, out_csv, out_file, start_date, end_date, limit, offset)
  File "/tmp/regenerate/regenerate.py", line 57, in execute_process
    db.execute(sql, (id_file, size, id_volume, id_type_file, id_user))
psycopg2.ProgrammingError: function utility_function(integer, integer, integer, integer, integer) does not exist
LINE 1: select * from utility_function(13456, 132456798, 0...
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Я не могу понять, как привести параметры к правильному типу postgresql.

Код Python выглядит следующим образом.

sql = 'select * from utility_function(%s, %s, %s, %s, %s)'
logging.debug(db.mogrify(sql, (id_file, size, id_volume, id_type_file, id_user)))
db.execute(sql, (id_file, size, id_volume, id_type_file, id_user))

db.mogrify возвращает это:

select * from utility_regenerate_tsstream(13456, 132456798, 0, 42, 1324)

Заранее спасибо за помощь :) Сэм

Ответы [ 2 ]

5 голосов
/ 30 марта 2012

Вы можете указать типы в запросе как приведения:

sql = 'select * from utility_function(%s::bigint, %s::bigint, %s::smallint, %s::bigint, %s::bigint)'
1 голос
/ 26 марта 2012

Мне удалось преодолеть проблему, изменив тип параметра proc с smallint на int.Кажется, что psycopg2 не обрабатывает вывод типов для smallint ...

p_id_volume smallint -> p_id_volume int

Никаких других изменений не было.

...