I have a python script that calls a postgresql proc using psycopg2. The proc has the following signature.
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
When I call it with the following code, I get this error...
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.
I can't figure out how to cast the parameters to the correct postgresql type.
The python code looks like this.
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 returns this:
select * from utility_regenerate_tsstream(13456, 132456798, 0, 42, 1324)
Thanks in advance for your help :) Sam
您可以将查询中的类型指定为强制转换:
sql = 'select * from utility_function(%s::bigint, %s::bigint, %s::smallint, %s::bigint, %s::bigint)'
I've managed to overcome the problem by changing the parameter type of the proc from smallint to int. It seems that psycopg2 doesn't handle the type inference for smallint...
p_id_volume smallint -> p_id_volume int
No other changes were needed.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.