Basé sur votre mogrify()
mis à jour sortie, vos chaînes et datetimes semblent être correctement interprétées. Le E'foo bar'
est la "constante de chaîne d'échappement" de Postgres. Il vous permet de représenter des séquences d'échappement de style C, comme \t
pour onglet, dans le texte. Aussi le unknown
vous voyez dans le psycopg2.ProgrammingError
il n'y a pas lieu de s'inquiéter, c'est un comportement normal. Vous pouvez d'abord vérifier que le nombre d'arguments de votre appel de fonction est correct, et peut-être essayer d'appeler la procédure avec des paramètres écrits à la main pour identifier quel paramètre peut être à l'origine du problème :
Procédure d'essai :
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;
Exemple :
% 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.