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

Psycopg2 conteggio righe per il cursore lato server

Nel caso di un cursore lato server, sebbene cursor.execute() restituisce, la query non è stata necessariamente eseguita dal server a quel punto, quindi il conteggio delle righe non è disponibile per psycopg2 . Ciò è coerente con le specifiche DBAPI 2.0 che afferma che rowcount dovrebbe essere -1 se il conteggio delle righe dell'ultima operazione è indeterminato.

Tenta di forzarlo con cursor.fetchone() , ad esempio, aggiorna cursor.rowcount , ma solo dal numero di elementi recuperati, quindi non è utile. cursor.fetchall() risulterà in rowcount essere impostato correttamente, tuttavia, esegue l'intera query e il trasferimento dei dati che cerchi di evitare.

Una possibile soluzione alternativa che evita una query completamente separata per ottenere il conteggio e che dovrebbe fornire risultati accurati è:

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

Ciò comporterà che ogni riga avrà il conteggio delle righe della tabella aggiunto come colonna finale. È quindi possibile ottenere il conteggio delle righe della tabella utilizzando cursor.fetchone() e poi prendendo l'ultima colonna:

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]

Ora count conterrà il numero di righe nella tabella. Puoi usare row[:-1] per fare riferimento ai dati della riga.

Ciò potrebbe rallentare la query perché un SELECT COUNT(*) potrebbe essere costoso verrà eseguito, ma una volta terminato il recupero dei dati dovrebbe essere veloce.