Psycopg2 có một giao diện đẹp để làm việc với các con trỏ phía máy chủ. Đây là một mẫu có thể sử dụng:
with psycopg2.connect(database_connection_string) as conn:
with conn.cursor(name='name_of_cursor') as cursor:
cursor.itersize = 20000
query = "SELECT * FROM ..."
cursor.execute(query)
for row in cursor:
# process row
Đoạn mã trên tạo kết nối và tự động đặt kết quả truy vấn vào con trỏ phía máy chủ. Giá trị itersize
đặt số hàng mà máy khách sẽ kéo xuống tại một thời điểm từ con trỏ phía máy chủ. Giá trị bạn sử dụng phải cân bằng giữa số lượng cuộc gọi mạng và sử dụng bộ nhớ trên máy khách. Ví dụ:nếu số kết quả của bạn là ba triệu, một itersize
giá trị 2000 (giá trị mặc định) sẽ dẫn đến 1500 cuộc gọi mạng. Nếu bộ nhớ được tiêu thụ bởi 2000 hàng là nhẹ, hãy tăng con số đó.
Khi sử dụng for row in cursor
tất nhiên bạn đang làm việc với từng hàng một, nhưng Psycopg2 sẽ tìm nạp trước itersize
hàng tại một thời điểm cho bạn.
Nếu bạn muốn sử dụng fetchmany
vì lý do nào đó, bạn có thể làm điều gì đó như sau:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
Việc sử dụng fetchmany
này sẽ không kích hoạt cuộc gọi mạng tới máy chủ cho nhiều hàng hơn cho đến khi hết lô tìm nạp trước. (Đây là một ví dụ phức tạp không cung cấp gì qua đoạn mã trên, nhưng trình bày cách sử dụng fetchmany
nếu có nhu cầu.)