11

データベースから大量のデータを取得する際に Django ORM の弱点を「バイパス」するために、サーバー側カーソルを実装しようとしています。しかし、現在のコードが正しく機能していないように見えるため、名前付きカーソルがどのように定義されるべきかわかりません。カーソルを次のように定義します。

id = 'cursor%s' % uuid4().hex
connection = psycopg2.connect('my connection string here')
cursor = connection.cursor(id, cursor_factory=psycopg2.extras.RealDictCursor)

カーソルは、反復可能で期待されるレコードを python 辞書として返すという点で機能しているようですが、閉じようとすると ( cursor.close()) 例外が発生します。

psycopg2 OperationalError: cursor *the generated cursor id* does not exist

なんてこと?!では、データベースからデータを取得するために使用しているオブジェクトは何ですか? 私が定義したものがデータベースに見つからないため、psycopg2はフォールバックのデフォルト(名前なし)カーソルを使用していますか(もしそうなら...私の大きな質問:psycopg2を使用する前にdbレベルでカーソルを定義することは必須ですか?)とても混乱しています、私を助けてくれませんか?

4

4 に答える 4

8

モデルをいじって、Pytest でテストを開始するときに、この問題が発生しました。

問題を解決したのは、テスト ユニットのデータベースをリセットすることでした。--create-db を次のように使用しました。

pytest backend/test_projects/partners/test_actions.py --create-db
于 2018-04-25T19:45:53.420 に答える
4

psycopg2 ドキュメントから:

「名前付きカーソルは通常、保持なしで作成されます。つまり、現在のトランザクションの間だけ存続します。 commit() の後に名前付きカーソルからフェッチしようとしたり、接続トランザクション分離レベルが AUTOCOMMIT に設定されているときに名前付きカーソルを作成しようとすると、例外的に。」

つまり、これらのカーソルを明示的に閉じる必要はありません。

http://initd.org/psycopg/docs/usage.html#server-side-cursors

于 2013-09-28T18:24:48.687 に答える