PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

python + psycopg2 =unbekannte Typen?

Basierend auf Ihrem aktualisierten mogrify() Ausgabe scheinen Ihre Zeichenfolgen und Datumsangaben richtig interpretiert zu werden. Die E'foo bar' ist die "Escape-String-Konstante" von Postgres. Damit können Sie Escape-Sequenzen im C-Stil wie \t darstellen für Tabulator, im Text. Auch der unknown Sie sehen im psycopg2.ProgrammingError kein Grund zur Sorge, das ist normales Verhalten. Sie könnten zuerst überprüfen, ob die Anzahl der Argumente für Ihren Funktionsaufruf korrekt sind, und vielleicht versuchen, die Prozedur mit einem handgeschriebenen Parameter aufzurufen, um festzustellen, welcher Parameter ein Problem verursachen könnte:

Testverfahren:

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;

Beispiel:

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