2011-03-10 82 views
3

看来当我使用callproc()时,psycopg2没有正确地将字符串转换为文本或字符。python + 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” 是未知的,而不是文本/字符和行[ “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'手段...基于更新后的mogrify()输出

回答

2

,你的字符串和日期时间似乎被正确解释。 E'foo bar'是Postgres的“escape string constant”。它可以让你在文本中表示C风格的转义序列,如\t。您在psycopg2.ProgrammingError中看到的unknown也无需担心,这是正常行为。你可能会首先检查的参数的函数调用的数量是正确的,也许尝试调用带有手写PARAMS的程序,以确定哪些PARAM可能会引起一个问题:

测试步骤:

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.