86

MySQLdbを使用してPython経由でMySQL-Serverに接続する場合。connection私は次のようなものを作成しますcursor

connection = MySQLdb.connect(...)
cursor = connection.cursor()
# process

MySQL処理が完了したら、を閉じる必要がありconnectionます。今私は疑問に思っていました:次のようにして閉じるだけで十分ですかconnection

connection.close()

または、cursor最初に閉じてから閉じなければなりませconnectionんか?このような:

cursor.close()
connection.close()
4

4 に答える 4

79

MySQLdbまたはpython2/3を接続するための他のパッケージを使用してSQL接続に出くわすすべての人に、これを知る必要があるすべての人にベストプラクティスを繰り返します。

(次のモック実行は、SQLデータベースにtablenameという名前のテーブルがあることを前提としています。field1、field2、field3、field4という名前の4つの列/フィールドがあります)。接続がローカル(同じマシン)の場合、「localhost」とも呼ばれる127.0.0.1です。

プロセスは単純な7つのステップです

  1. 接続を作成する
  2. カーソルを作成
  3. クエリ文字列を作成する
  4. クエリを実行します
  5. クエリにコミットする
  6. カーソルを閉じる
  7. 接続を閉じます

これがステムモックランによる簡単なステップです

mydb = MySQLdb.connect(host=host, user=user, passwd=passwd, db=database, charset="utf8")
cursor = mydb.cursor()
query = "INSERT INTO tablename (text_for_field1, text_for_field2, text_for_field3, text_for_field4) VALUES (%s, %s, %s, %s)"
cursor.execute(query, (field1, field2, field3, field4))
mydb.commit()
cursor.close()
mydb.close()

接続とカーソルが異なります。接続はSQLレベルですが、カーソルはデータ要素と見なすことができます。1つの接続内で同じデータに複数のカーソルを置くことができます。同じコンピュータから同じデータに複数の接続があるのは珍しいことです。

詳細については、ここで説明しています 。「カーソルパラダイムはPythonに固有のものではなく、データベース自体で頻繁に使用されるデータ構造です。

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

于 2018-11-07T00:48:30.573 に答える
14

使い終わったらすぐにカーソルを閉じるのがおそらく最善の策です。もう使用しないからです。ただし、db接続後に閉じることが有害な場所は見たことがありません。ただし、次のように設定できるため、次のように設定できます。

cursor = conn.cursor()

エラーが発生する可能性があるため、誤って再度割り当ててDB接続を閉じた場合に備えて、前に閉じることをお勧めします。したがって、接続を閉じた状態で誤って再割り当てされるのを防ぐために、最初にそれを閉じることをお勧めします。

(ガベージコレクターによって収集されるため、まったく閉じないものもあります(Pythonではsqliteを使用してカーソルを閉じる必要がありますか?))

参照: MySQLdbを使用してカーソルを閉じるタイミング

sqliteを使用するPythonでは、カーソルを閉じる必要がありますか?

于 2013-07-15T23:52:12.317 に答える
3

この特定のコンテキストでは、接続を閉じるだけで十分です。複数のカーソルなどを使用している場合は、適切なリソース管理に注意する必要があります。

于 2011-03-31T18:14:08.050 に答える
-30

を使用するwithと、このツールを使用して、前のインデントレベルに戻ると閉じる一時カーソルを作成できます。

from contextlib import closing
with closing( connection.cursor() ) as cursor:
    (indented) use the cursor

(non-indented) cursor is closed.
connection.close()
于 2011-03-31T18:59:31.347 に答える