2 Stimmen

SQL holt Daten aus dem BEGIN; ...; END; Block in Python

Ich möchte viele Select-Abfragen auf einmal ausführen, indem ich sie zwischen BEGIN; END; . Ich habe das Folgende versucht:

cur = connection.cursor()
cur.execute("""
BEGIN;
SELECT ...;
END;""")
res = cur.fetchall()

Ich erhalte jedoch die Fehlermeldung:

psycopg2.ProgrammingError: no results to fetch

Wie kann ich auf diese Weise tatsächlich Daten erhalten?

Wenn ich mehrere Selects hintereinander habe, erhalte ich nur die Daten des letzten Selects zurück. Gibt es eine Möglichkeit, Daten aus allen Selects abzurufen?

4voto

araqnid Punkte 116680

Postgresql unterstützt eigentlich nicht die Rückgabe mehrerer Ergebnismengen aus einem einzigen Befehl. Wenn Sie diese Eingabe an psql übergeben:

BEGIN;
SELECT ...;
END;

wird dies clientseitig aufgeteilt und tatsächlich drei Anweisungen ausgeführt, von denen nur die zweite eine Ergebnismenge liefert.

"BEGIN" und "END" sind SQL-Befehle zum Starten/Beenden einer Transaktion. (Möglicherweise gibt es dafür ein Protokoll auf niedrigerer Ebene, aber ich kann mich nicht erinnern). Wahrscheinlich wollen Sie diese Befehle nicht direkt ausgeben, sondern dies Ihrem Treiber (psycopg2) überlassen. Bei Perls DBI gebe ich zum Beispiel AutoCommit=>0 an, wenn ich mich verbinde, und es gibt implizit ein "BEGIN" vor meinem ersten Befehl aus; und dann "END" (oder "COMMIT" usw.), wenn ich explizit $dbh->commit aufrufe; ich vermute, Pythons DB-API funktioniert ähnlich, da andere Systeme wie JDBC das auch tun...

0voto

rfusca Punkte 6827

Wenn Sie nur SELECTing etwas und Sie haben nicht eine Funktion, die alle DML oder dergleichen führt, sollten Sie nicht brauchen, um eine explizite Transaktion für jeden Grund, die ich kenne zu machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X