1. ホーム
  2. mysql

[解決済み] MySQLでsqlalchemyの接続を閉じる方法

2023-06-20 08:31:39

質問

実行したいサンプルコードです。

for i in range(1,2000):
    db = create_engine('mysql://root@localhost/test_database')
    conn = db.connect()
    #some simple data operations
    conn.close()
    db.dispose()

MySQL から "Too many connections" エラーを受けることなくこれを実行する方法はありますか? 私はすでに、それ以外の接続を処理するか、接続プールを持つことができることを知っています。私はただ、sqlalchemyから接続を適切に閉じる方法を理解したいのです。 事前にありがとうございます!

どのように解決するのですか?

そのコードを正しく書く方法を説明します。

db = create_engine('mysql://root@localhost/test_database')
for i in range(1,2000):
    conn = db.connect()
    #some simple data operations
    conn.close()
db.dispose()

つまり Engine ファクトリー と同様、接続のための プール を使用します。 というときは conn.close() と言う場合、その接続は エンジン内の接続プールに戻されます。 であり、実際には閉じられていない。

接続を実際に閉じたい場合、つまり、プールされないようにしたい場合は NullPool :

from sqlalchemy.pool import NullPool
db = create_engine('mysql://root@localhost/test_database', poolclass=NullPool)

上記の Engine の構成では、各呼び出しは conn.close() を呼び出すたびに、基礎となる DBAPI 接続が閉じられます。

もしあなたが実際に 異なる データベースに接続したい場合、つまり、ハードコードされた "localhost/test_database" は単なる例であり、実際にはたくさんの異なるデータベースがある場合 dispose() を使用するアプローチは問題ありません。プールからチェックアウトされていないすべての接続をクローズします。

上記のすべてのケースにおいて、重要なのは Connection オブジェクトを閉じるのに close() . もし、何らかのコネクションレス型の実行を行なっているのであれば、それは engine.execute() または statement.execute() というように ResultProxy オブジェクトを完全に読み込むか、あるいは、明示的に閉じる必要があります。 close() . A Connection または ResultProxy がまだ開いている場合は NullPool または dispose() は、最後の接続をすべて閉じることからアプローチします。