I fallet med en markör på serversidan, även om cursor.execute()
returnerar, har frågan inte nödvändigtvis körts av servern vid den tidpunkten, och därför är radantalet inte tillgängligt för psycopg2
. Detta överensstämmer med DBAPI 2.0-specifikationen
som anger att rowcount
ska vara -1 om radantalet för den senaste operationen är obestämt.
Försöker att tvinga den med cursor.fetchone()
, till exempel uppdaterar cursor.rowcount
, men bara efter antalet hämtade objekt, så det är inte användbart. cursor.fetchall()
kommer att resultera i rowcount
är korrekt inställd, men som utför hela sökningen och överföringen av data som du försöker undvika.
En möjlig lösning som undviker en helt separat fråga för att få räkningen och som borde ge korrekta resultat är:
select *, (select count(*) from test) from test;
Detta kommer att resultera i att varje rad har tabellens radantal som den sista kolumnen. Du kan sedan få tabellradernas antal med cursor.fetchone()
och sedan ta den sista kolumnen:
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]
Nu count
kommer att innehålla antalet rader i tabellen. Du kan använda row[:-1]
för att referera till raddata.
Detta kan sakta ner frågan eftersom en möjligen dyr SELECT COUNT(*)
kommer att utföras, men när informationen är klar bör det gå snabbt.