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.