2012-05-18 5 views
10

なぜpythonにカーソルオブジェクトが必要なのか混乱しています。私はjdbcを知っているし、データベース接続は非常に直感的ですが、私はカーソルオブジェクトと混同しています。また、私はcursor.close()とconnection.close()関数の違いは何かについては疑問があります。カーソルと接続オブジェクトの違い

答えて

13

カーソルパラダイムはPythonに固有のものではありませんが、databases themselvesでは頻繁に使用されるデータ構造です。

基本的な実装によっては、同じ接続をデータベースに共有する複数のカーソルを生成することができます。カーソルを閉じると、DBからフェッチされない(またはフェッチされたが使用されていない)結果を含むクエリーに関連付けられたリソースを解放する必要がありますが、データベースへの接続を削除しないため、同じデータベースで新しいカーソルを取得できます再度認証する必要はありません。

+0

私たちは同時に2つのカーソルを持つことができます。はいの場合、同時実行の問題について言及してください –

+1

これらのすべての詳細は「基礎となる実装に依存して」隠されています。対応するDBドライバ – Toote

+0

のドキュメントを読む必要がありますウィキペディアによると:「コンピュータ科学では、データベースカーソルは、データベース内のレコードを走査することを可能にする制御構造です。カーソルは、走査、データベースレコードの検索、追加、削除など、 Pythonがカーソルを実装する方法は、その記述とうまく一致しません。単純なイテレータの場合は、SQL文の実行に責任を負いません。それはPython固有のものではありませんか?そして説明に値する何か? – skyking

1

接続オブジェクトはデータベースへの接続です。データベースとの接続が完了したら、接続オブジェクトは閉じます。 Cursorオブジェクトは、クエリの結果セットに対するイテレータです。その結果セットが終了したらそれらを閉じます。

+2

SQLの文字列を実行するexecute(sql_string)というコマンドがあるので、イテレータであるとは限りません。結果セットの反復子がそのような機能を持つことは意味がありません –

+0

あなたは正しいですが、カーソルはクライアント上の構造だけでなくサーバー上の構造でもあります。これは、準備されたSQL文を利用して実行し、実行後にその結果を反復処理するのに役立ちます。 – Toote

5

他にも触れられているように、Connection()はデータベースへのネットワーク接続であり、実際にはカーソルを返すだけです。 PEP-249(DBApi 2.0が指定されている)では、接続またはカーソルが正確に何であるかを明確に定義しておらず、それぞれの方法で何を行う必要があるのか​​も明確に定義されていません。唯一 <module>.connect()<module>.Connection.cursor()<module>.Cursor 、および <module>.Cursor.execute() のインスタンスを返す必要があること、 <module>.Connection のインスタンスを返す必要があることが提供声明を呼び出​​し、結果の行を返す必要があります。具体的には、 <module>.Connection.execute()を定義していませんが、特定の実装では拡張として実装することは自由です。

しかし、これらの拡張機能によっては、ポータブルコードを持たないため、おそらく賢明ではありません。中間オブジェクトなしで接続上で実行すると、一部のデータベースでは困難になる可能性があるため、DBApiではこの2つのレベルの要件があります。

関連する問題