sql >> データベース >  >> RDS >> Mysql

MySQLdb接続コンテキストマネージャーがカーソルを閉じないのはなぜですか?

    あなたの質問に直接答えるには:withの最後で閉じることで何の害も見られません ブロック。この場合、なぜそれが行われないのかは言えません。しかし、この質問には活動が不足しているため、コード履歴を検索して、いくつかの考えを投げかけます(推測 close()の理由について 可能性があります 呼ばれない:

    1. nextset()の呼び出しをスピンスルーする可能性はわずかです。 例外をスローする可能性があります-おそらくこれは観察され、望ましくないと見なされていました。これが、新しいバージョンのcursors.py close()にこの構造が含まれています :

      def close(self):
          """Close the cursor. No further queries will be possible."""
          if not self.connection:
              return
      
          self._flush()
          try:
              while self.nextset():
                  pass
          except:
              pass
          self.connection = None
      
    2. 何もせずに残りのすべての結果をスピンスルーするのに時間がかかる可能性がある(やや遠い)可能性があります。したがって、close() 不必要な反復を避けるために呼び出されない場合があります。これらのクロックサイクルを節約する価値があるかどうかは主観的なものだと思いますが、「必要ない場合は実行しないでください」という方針に沿って議論することもできます。

    3. sourceforgeコミットを参照すると、このコミットによって機能がトランクに追加されました / a> 2007年に、connections.pyのこのセクションは それ以来変わっていません。これは、このコミット に基づくマージです。 、メッセージがあります

      そして、あなたが引用するコードはそれ以来変更されていません。

      これは私の最終的な考えを促します-それはおそらく、機能したばかりで変更されなかった最初の試み/プロトタイプです。

    より新しいバージョン

    コネクタのレガシーバージョンのソースにリンクします。同じライブラリのよりアクティブなフォークがあることに注意してくださいここ 、ポイント1の「新しいバージョン」に関するコメントでリンクしています。

    このモジュールの最新バージョンでは、__enter__()が実装されていることに注意してください。 および__exit__() cursor内 それ自体:こちらをご覧ください__exit__() ここでします self.close() おそらくこれは、with構文を使用するためのより標準的な方法を提供します。例:

    with conn.cursor() as c:
        #Do your thing with the cursor
    

    エンドノート

    N.B. connへの参照がなくなったら、ガベージコレクション(専門家でもない)を理解している限り、追加する必要があると思います。 、割り当てが解除されます。この時点では、カーソルオブジェクトへの参照はなく、割り当ても解除されます。

    ただし cursor.close()を呼び出す ガベージコレクションされるという意味ではありません。結果を焼き尽くし、接続をNoneに設定するだけです。 。つまり、再利用することはできませんが、すぐにガベージコレクションされることはありません。 cursor.close()を手動で呼び出すことで、そのことを確信できます。 withの後 ブロックしてから、たとえば、cursorの属性を出力します。

    N.B。 2 これはwithのやや珍しい使い方だと思います connとしての構文 オブジェクトはすでに外部スコープにあるため、存続します。たとえば、より一般的なwith open('filename') as f:とは異なります。 withの終了後に参照でぶら下がっているオブジェクトがない場合 ブロック。




    1. データプロジェクトが失敗する10の方法

    2. 2つの日付の時間差を取得するにはどうすればよいですか?

    3. PDO接続の何が問題になっていますか?

    4. SQLite group by / count時間、日、週、年