sql >> Database >  >> RDS >> PostgreSQL

Psycopg2 rijtelling voor cursor aan de serverzijde

In het geval van een server-side cursor, hoewel cursor.execute() retourneert, is de query op dat moment niet noodzakelijkerwijs uitgevoerd door de server, en dus is het aantal rijen niet beschikbaar voor psycopg2 . Dit komt overeen met de DBAPI 2.0-specificatie waarin staat dat rowcount moet -1 zijn als het aantal rijen van de laatste bewerking onbepaald is.

Pogingen om het te forceren met cursor.fetchone() , bijvoorbeeld, updates cursor.rowcount , maar alleen door het aantal opgehaalde items, dus dat is niet handig. cursor.fetchall() resulteert in rowcount als het echter correct is ingesteld, wordt de volledige query en overdracht van gegevens uitgevoerd die u wilt vermijden.

Een mogelijke oplossing die een volledig aparte zoekopdracht vermijdt om de telling te krijgen, en die nauwkeurige resultaten zou moeten opleveren, is:

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

Dit zal ertoe leiden dat aan elke rij het aantal rijen van de tabel wordt toegevoegd als de laatste kolom. U kunt dan het aantal rijen in de tabel verkrijgen met cursor.fetchone() en neem dan de laatste kolom:

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 bevat het aantal rijen in de tabel. U kunt row[:-1] . gebruiken om naar de rijgegevens te verwijzen.

Dit kan de zoekopdracht vertragen omdat een mogelijk dure SELECT COUNT(*) worden uitgevoerd, maar als het eenmaal klaar is, moeten de gegevens snel worden opgehaald.




  1. ontbrekende FROM-clausule voor tabel Grupo cakephp

  2. Twee PLSQL-statements met begin en einde, afzonderlijk goed werken, maar niet samen?

  3. Hoeveel database-indexen is te veel?

  4. 7 gratis hulpprogramma's voor het maken van databasediagrammen voor drukke gegevensmensen