Tôi gặp phải một vấn đề tương tự và sau vài giờ đổ máu, mồ hôi và nước mắt, tôi đã tìm thấy câu trả lời chỉ yêu cầu thêm một tham số.
Thay vì
cursor = conn.cursor()
viết
cursor = conn.cursor(name="my_cursor_name")
hoặc đơn giản hơn
cursor = conn.cursor("my_cursor_name")
Chi tiết được tìm thấy tại http://initd.org/psycopg/docs/usage.html#server-side-cursors
Tôi thấy các hướng dẫn hơi khó hiểu ở chỗ tôi cần phải viết lại SQL của mình để bao gồm "DECLARE my_cursor_name ...." và sau đó là "FETCH count 2000 FROM my_cursor_name" nhưng hóa ra psycopg thực hiện tất cả điều đó cho bạn dưới mui xe nếu bạn chỉ ghi đè tham số mặc định "name =None" khi tạo con trỏ.
Đề xuất sử dụng fetchone hoặc fetchmany ở trên không giải quyết được sự cố vì nếu bạn không đặt tham số name, psycopg theo mặc định sẽ cố gắng tải toàn bộ truy vấn vào ram. Điều duy nhất bạn có thể cần làm (ngoài việc khai báo một tham số tên) là thay đổi thuộc tính cursor.itersize từ mặc định 2000 thành 1000 nếu bạn vẫn còn quá ít bộ nhớ.