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.