PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

python + psycopg2 =types inconnus ?

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.