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.