Python がカーソルオブジェクトを必要とする理由について混乱しています。私はjdbcを知っており、データベース接続は非常に直感的ですが、Pythonではカーソルオブジェクトと混同されています。また、リソースの解放に関して、cursor.close() と connection.close() 関数の違いは何なのか疑問です。
3 に答える
カーソル パラダイムは Python に固有のものではありませんが、データベース自体で頻繁に使用されるデータ構造です。
基礎となる実装によっては、データベースへの同じ接続を共有する複数のカーソルを生成できる場合があります。カーソルを閉じると、クエリに関連付けられているリソースが解放されます。これには、DB からフェッチされなかった (またはフェッチされたが使用されなかった) 結果が含まれますが、データベース自体への接続は排除されないため、同じデータベースで新しいカーソルを取得できます。再度認証する必要はありません。
他の人が言及しているように、 aConnection()
はデータベースへのネットワーク接続であり、実際の用途はカーソルを返すことだけです。 DBApi 2.0 が指定されているPEP-249close()
では、接続またはカーソルが正確に何であるか、またはそれぞれのメソッドが何をしなければならないかを明確に定義していません。<module>.connect()
のインスタンスを返さなければなら
<module>.Connection
ず
、
のインスタンスを返さなければならず
、
提供されたステートメントを呼び出して、結果の行を返さ<module>.Connection.cursor()
なければなりません
。
特に、特定の実装では拡張機能として自由に実装できますが、定義されていません
。<module>.Cursor
<module>.Cursor.execute()
<module>.Connection.execute()
ただし、これらの拡張機能に依存することはおそらく賢明ではありません。移植可能なコードがなくなるからです。データベースによっては、中間オブジェクトなしで接続を実行することが困難な場合があるため、DBApi はこの 2 レベルの要件を設けています。
接続オブジェクトは、データベースへの接続です。データベースとの通信がすべて完了したら、接続を閉じます。Cursor オブジェクトは、クエリからの結果セットに対する反復子です。その結果セットを使い終わったら、それらを閉じます。