sql >> Databasteknik >  >> RDS >> PostgreSQL

Psycopg2 radantal för markör på serversidan

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.




  1. Skillnad mellan Subquery och Correlated Subquery

  2. Hur konverterar man sekunder (eller millisekunder) till en tidsstämpel (eller bara en sträng som ser ut som ett datum) i mySql

  3. Rekursiva kategorier med en enda fråga?

  4. MYSQL - Skillnaden mellan IN och EXIST