python + psycopg2 =未知类型?

时间:2011-03-10 23:07:28

标签: python postgresql psycopg2

当我使用callproc()时,psycopg2没有正确地将字符串转换为文本或字符变化。

例如:

values = [pid, 4, 4, 'bureau ama', 0, 130, row['report_dte'], row['report_dte'], 1, 1, 1, None, None, 'published', row['report_dte']]
cur.callproc('header', values)

收率:

psycopg2.ProgrammingError: function header(integer, integer, integer, unknown, integer, integer, unknown, unknown, integer, integer, integer, unknown, unknown, unknown, unknown) does not exist
LINE 1: SELECT * FROM header(509952,4...

首先,“局部ama”是未知的而不是文本/字符,而row [“report_dte”]都是未知的,它们是数据库中的日期类型,python中的datetime.date对象。

有什么想法吗?使用python 2.6.5。使用cur.mogrify(),查询看起来像:

SELECT header(509952,4,4,E'bureau ama',0,130,'2011-01-24','2011-01-24',1,1,1,NULL,NULL,E'published','2011-01-24')

不确定E'bureau pitcher ama'的含义......

1 个答案:

答案 0 :(得分:2)

根据您更新的mogrify()输出,您的字符串和日期时间似乎正确解释。 E'foo bar'是Postgres'“转义字符串常量”。它允许您在文本中表示C样式的转义序列,例如\t选项卡。您在unknown中看到的psycopg2.ProgrammingError也无需担心,这是正常行为。您可能首先检查函数调用的参数数量是否正确,并且可能尝试使用手写的参数调用该过程以确定哪个参数可能导致问题:

测试程序:

CREATE OR REPLACE FUNCTION
    foo (num INTEGER, name VARCHAR, ts TIMESTAMP)
RETURNS TABLE (num INTEGER, name VARCHAR, ts TIMESTAMP)
AS $$ SELECT $1, $2, $3; $$
LANGUAGE SQL;

示例:

% python
>>> import datetime
>>> import psycopg2
>>> conn = psycopg2.connect("user=postgres")
>>> r = conn.cursor()
>>> args = [1, "hello", datetime.datetime.now()]
>>> r.callproc('foo', args)
[1, 'hello', datetime.datetime(2011, 3, 10, 18, 51, 24, 904103)]

>>> r.callproc('fooxyz', args)
psycopg2.ProgrammingError: function fooxyz(integer, unknown, unknown) does not exist

LINE 1: SELECT * FROM fooxyz(1,E'hello','2011-03-10T18:51:24.904103'...
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.