Trong trường hợp con trỏ phía máy chủ, mặc dù cursor.execute()
trả về, truy vấn không nhất thiết phải được thực thi bởi máy chủ tại thời điểm đó và do đó, số lượng hàng không khả dụng cho psycopg2
. Điều này phù hợp với DBAPI 2.0 spec
trong đó nói rằng rowcount
phải là -1 nếu số hàng của thao tác cuối cùng là không xác định.
Cố gắng cưỡng chế nó bằng cursor.fetchone()
, ví dụ:các bản cập nhật cursor.rowcount
, nhưng chỉ bằng số lượng mục được truy xuất, vì vậy điều đó không hữu ích. cursor.fetchall()
sẽ dẫn đến rowcount
Tuy nhiên, được đặt đúng cách sẽ thực hiện truy vấn và chuyển dữ liệu đầy đủ mà bạn muốn tránh.
Một giải pháp khả thi tránh truy vấn hoàn toàn riêng biệt để lấy số lượng và sẽ cho kết quả chính xác là:
select *, (select count(*) from test) from test;
Điều này sẽ dẫn đến việc mỗi hàng có số hàng trong bảng được thêm vào làm cột cuối cùng. Sau đó, bạn có thể lấy số hàng trong bảng bằng cách sử dụng cursor.fetchone()
và sau đó lấy cột cuối cùng:
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]
Bây giờ count
sẽ chứa số hàng trong bảng. Bạn có thể sử dụng row[:-1]
để tham chiếu đến dữ liệu hàng.
Điều này có thể làm chậm truy vấn vì SELECT COUNT(*)
có thể đắt tiền sẽ được thực hiện, nhưng sau khi hoàn thành, việc truy xuất dữ liệu sẽ nhanh chóng.