python + psycopg2 = неизвестные типы? - PullRequest
3 голосов
/ 11 марта 2011

Кажется, что когда я использую 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...

Во-первых, вместо текста / символа неизвестно, что такое "бюро ама", а все строки ["report_dte"] неизвестны, где они являются типами даты в базе данных и объектами datetime.date в языке python.

Есть идеи?Использование 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 голосов
/ 11 марта 2011

Исходя из вашего обновленного вывода mogrify(), ваши строки и дата и время отображаются правильно. E'foo bar' является «константой escape-строки» Postgres. Это позволяет вам представлять escape-последовательности в стиле 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.
...