PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

python + psycopg2 =tipi sconosciuti?

Basato sul tuo mogrify() aggiornato output, le tue stringhe e datetime sembrano essere interpretate correttamente. Il E'foo bar' è la "costante della stringa di escape" di Postgres. Ti consente di rappresentare sequenze di escape in stile C, come \t per tab, nel testo. Anche il unknown vedi nel psycopg2.ProgrammingError non c'è niente di cui preoccuparsi, questo è un comportamento normale. Potresti prima controllare che il numero di argomenti della tua chiamata di funzione sia corretto e forse provare a chiamare la procedura con un parametro scritto a mano per identificare quale parametro potrebbe causare un problema:

Procedura di prova:

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;

Esempio:

% 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.