python + psycopg2 = 未知类型?

3 投票
1 回答
4990 浏览
提问于 2025-04-16 13:28

看起来当我使用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...

首先,“bureau 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 个回答

2

根据你更新的 mogrify() 输出,你的字符串和日期时间看起来都被正确理解了。E'foo bar' 是 Postgres 的“转义字符串常量”。它让你可以在文本中表示 C 语言风格的转义序列,比如 \t 代表制表符。此外,你在 psycopg2.ProgrammingError 中看到的 unknown 也不用担心,这属于正常现象。你可以先检查一下你调用函数时传入的参数数量是否正确,或者尝试用手动写的参数来调用这个过程,以找出哪个参数可能导致了问题:

测试过程:

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.

撰写回答