psycopg2查询参数类型

时间:2012-03-26 10:11:07

标签: python postgresql psycopg2

我有一个使用psycopg2调用postgresql proc的python脚本。该程序具有以下签名。

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 个答案:

答案 0 :(得分:5)

您可以将查询中的类型指定为强制转换:

sql = 'select * from utility_function(%s::bigint, %s::bigint, %s::smallint, %s::bigint, %s::bigint)'

答案 1 :(得分:1)

我设法通过将proc的参数类型从smallint更改为int来克服这个问题。似乎psycopg2不处理smallint的类型推断...

p_id_volume smallint - &gt; p_id_volume int

不需要进行任何其他更改。