2017-02-17 9 views
6

私はデータベース作業に重点を置いて毎日Pythonを使用します。私の標準のスタートpyodbc使用Python pyodbc cursor対データベースカーソル

connection_hostname = pyodbc.connect('connection_string') 
cursor_hostname = connection_hostname.cursor() 
command_hostname = 'select * from everything_forever;' 
cursor_hostname.execute('command_hostname') 

のようなものであると私は新しいカーソルを作成するのではなく、別のクエリのためのカーソルを再利用する必要がある場合、私はそうのような最初のクエリから結果セットを保存することができます:

results_from_query = cursor_hostname.fetchall() 

その後に移動してください。

このアプローチはこれまでのところうまくいきました。

最近、仕事を変更しました。私は、上記の手法を実証したときにGUIを使用してDBを使用する新しい同僚の一部がパニックに陥り始めました。それを設定したのはカーソルキーワードでした。私はカーソルがセット理論にはないロジックを示し、ホストを低/ゼロレベルの並列化、RBARタイプの操作にする傾向があるため、カーソルはDBでノー・ノーであると理解していますが、上記の宣言は、SQL Serverのエンジニアリングと管理の帽子が置かれているときに考えるカーソルと同じです。

誰かが、これらのODBCカーソルとSQL Serverタイプのカーソルの違いについて説明できますか(私はそれらが異なっているとします)。

私が間違っている場合は、教えてくださいと私はより効率的に私のDBとのインターフェイスを教えてください。

なぜあなたはちょうど

connection_hostname.execute(command_hostname) 

のような接続から直接実行カント、彼らがそうであるように、私はODBCカーソル構造を持つように感じるが、接続コストと、そのようなを減らすために、同じ接続を介して複数のカーソルを許すとは何かを持っています。ベースオフですか?

答えて

2

データベースカーソルは、通常、正当な理由でDBAによって不正にされ、信頼されません。それらはパフォーマンスの問題の原因となることが多く、セットベースのアプローチはほとんど常に優れています。例えば

http://www.databasejournal.com/features/mssql/article.php/3896206/What-Every-DBA-Ought-to-Know-About-SQL-Server-Cursors-and-Their-Alternatives.htmは言う:

「私の職場では、カーソルが私たちのSQL Serverの標準規格で禁止されているカーソルを使用するために、我々はカーソルのパフォーマンスが処理するよりも優れていることを証明しなければなりません。あなたの神経質な友人に、Pythonカーソルが実際には他の言語がレコードセットや結果セットを呼び出すのと同義であること、そしてそのGUIツールもカーソル/レコードセットを使用していることを説明するかもしれません(ただし、DBにカーソルを作成しないでください)。

difference between cursor and connection objects