PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Số hàng psycopg2 cho con trỏ phía máy chủ

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sequelize.js vẫn xóa hàng trong bảng ngay cả khi paranoid được đặt thành true

  2. Postgres GROUP BY trên trường bên trong jsonb

  3. Hợp nhất nhiều hàng thành một hàng có nhiều giá trị hàng trong một cột

  4. TemplateSyntaxError:Caught ImportError khi render:khong the import name utils

  5. Rails:quyền bị từ chối đối với quan hệ schema_migrations