Dalam kasus kursor sisi server, meskipun cursor.execute()
kembali, kueri belum tentu dieksekusi oleh server pada saat itu, sehingga jumlah baris tidak tersedia untuk psycopg2
. Ini sesuai dengan spesifikasi DBAPI 2.0
yang menyatakan bahwa rowcount
seharusnya -1 jika jumlah baris dari operasi terakhir tidak dapat ditentukan.
Mencoba memaksanya dengan cursor.fetchone()
, misalnya, memperbarui cursor.rowcount
, tetapi hanya dengan jumlah item yang diambil, sehingga tidak berguna. cursor.fetchall()
akan menghasilkan rowcount
yang disetel dengan benar, yang melakukan kueri penuh dan transfer data yang ingin Anda hindari.
Solusi yang mungkin untuk menghindari kueri yang benar-benar terpisah untuk mendapatkan penghitungan, dan yang seharusnya memberikan hasil yang akurat adalah:
select *, (select count(*) from test) from test;
Ini akan menghasilkan setiap baris memiliki jumlah baris tabel yang ditambahkan sebagai kolom terakhir. Anda kemudian bisa mendapatkan jumlah baris tabel menggunakan cursor.fetchone()
dan kemudian mengambil kolom terakhir:
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]
Sekarang count
akan berisi jumlah baris dalam tabel. Anda dapat menggunakan row[:-1]
untuk merujuk ke data baris.
Ini mungkin memperlambat kueri karena SELECT COUNT(*)
yang mungkin mahal akan dilakukan, tetapi setelah selesai mengambil data harus cepat.