同様の問題が発生し、数時間の血、汗、涙の後、答えは1つのパラメータを追加するだけでよいことがわかりました。
代わりに
cursor = conn.cursor()
書く
cursor = conn.cursor(name="my_cursor_name")
またはもっとシンプルに
cursor = conn.cursor("my_cursor_name")
詳細については、http://initd.org/psycopg/docs/usage.html#server-side-cursors
をご覧ください。SQLを書き直して「DECLAREmy_cursor_name....」を含め、次に「FETCH count 2000 FROM my_cursor_name」を含める必要があるという点で、手順が少しわかりにくいことがわかりましたが、psycopgがすべてを実行していることがわかりました。カーソルを作成するときに「name=None」のデフォルトパラメータを上書きするだけの場合はフード。
上記のfetchoneまたはfetchmanyの使用の提案では、nameパラメーターを未設定のままにすると、psycopgはデフォルトでクエリ全体をRAMにロードしようとするため、問題は解決しません。 (名前パラメータを宣言する以外に)必要になる可能性がある他の唯一のことは、cursor.itersize属性をデフォルトの2000から、まだメモリが少なすぎる場合は1000に変更することです。