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

Psycopg2-Zeilenanzahl für serverseitigen Cursor

Im Fall eines serverseitigen Cursors jedoch cursor.execute() zurückgibt, wurde die Abfrage zu diesem Zeitpunkt nicht unbedingt vom Server ausgeführt, und daher ist die Zeilenanzahl für psycopg2 nicht verfügbar . Dies steht im Einklang mit der DBAPI 2.0-Spezifikation was besagt, dass rowcount sollte -1 sein, wenn die Zeilenanzahl der letzten Operation unbestimmt ist.

Versucht, es mit cursor.fetchone() zu erzwingen aktualisiert beispielsweise cursor.rowcount , aber nur nach der Anzahl der abgerufenen Elemente, was nicht sinnvoll ist. cursor.fetchall() ergibt rowcount richtig eingestellt ist, jedoch die vollständige Abfrage und Übertragung von Daten durchführt, die Sie vermeiden möchten.

Eine mögliche Problemumgehung, die eine vollständig separate Abfrage zum Abrufen der Anzahl vermeidet und genaue Ergebnisse liefern sollte, ist:

select *, (select count(*) from test) from test;

Dies führt dazu, dass jeder Zeile die Anzahl der Tabellenzeilen als letzte Spalte angehängt wird. Sie können dann die Anzahl der Tabellenzeilen mit cursor.fetchone() abrufen und dann die letzte Spalte nehmen:

with db.cursor('cursor_name') as cursor:
    cursor.execute('select *, (select count(*) from test) from test')
    row = cursor.fetchone()
    data, count = row[:-1], row[-1]

Jetzt count enthält die Anzahl der Zeilen in der Tabelle. Sie können row[:-1] verwenden um auf die Zeilendaten zu verweisen.

Dies könnte die Abfrage verlangsamen, da ein möglicherweise teurer SELECT COUNT(*) wird durchgeführt, aber wenn das Abrufen der Daten abgeschlossen ist, sollte es schnell gehen.