[英]python + psycopg2 = unknown types?
似乎当我使用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'
是什么意思......
根据您更新的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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.