sql >> Base de Datos >  >> RDS >> PostgreSQL

python + psycopg2 =¿tipos desconocidos?

Basado en tu mogrify() actualizado salida, sus cadenas y fechas y horas parecen interpretarse correctamente. La E'foo bar' es la "constante de cadena de escape" de Postgres. Te permite representar secuencias de escape de estilo C, como \t para tabulador, en texto. También el unknown ves en el psycopg2.ProgrammingError no hay nada de qué preocuparse, ese es un comportamiento normal. Primero puede verificar que la cantidad de argumentos para su llamada de función sea correcta, y quizás intente llamar al procedimiento con parámetros escritos a mano para identificar qué parámetro podría estar causando un problema:

Procedimiento de prueba:

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;

Ejemplo:

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