sql >> Database teknologi >  >> RDS >> PostgreSQL

Psychopg2 rækketæller for markør på serversiden

I tilfælde af en server-side cursor, selvom cursor.execute() returnerer, er forespørgslen ikke nødvendigvis blevet udført af serveren på det tidspunkt, og rækkeantallet er derfor ikke tilgængeligt for psycopg2 . Dette er i overensstemmelse med DBAPI 2.0-specifikationen som angiver, at rowcount skal være -1, hvis rækkeantallet for den sidste operation er ubestemt.

Forsøg på at tvinge det med cursor.fetchone() , for eksempel opdaterer cursor.rowcount , men kun efter antallet af hentede elementer, så det er ikke nyttigt. cursor.fetchall() vil resultere i rowcount er korrekt indstillet, der udfører den fulde forespørgsel og overførsel af data, som du søger at undgå.

En mulig løsning, der undgår en helt separat forespørgsel for at få optællingen, og som burde give nøjagtige resultater, er:

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

Dette vil resultere i, at hver række har tabelrækketællingen tilføjet som den sidste kolonne. Du kan derefter få tabelrækketællingen ved at bruge cursor.fetchone() og derefter tage den sidste kolonne:

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 vil indeholde antallet af rækker i tabellen. Du kan bruge row[:-1] for at henvise til rækkedataene.

Dette kan gøre forespørgslen langsommere, fordi en muligvis dyr SELECT COUNT(*) vil blive udført, men når du er færdig med at hente dataene, skulle det være hurtigt.




  1. Hurtigere Python MySQL

  2. Vis top N scores i MySQL 8 uden dubletter efter kategori

  3. indsæt hvis ikke eksisterer ellers skal du bare vælge i mysql

  4. Importer filstørrelsesgrænse i PHPMyAdmin