web-dev-qa-db-ja.com

SQLAlchemyセッションを閉じる方法は?

MySQLでsqlalchemy接続を閉じる方法 でコメントしたことに従って、SQLAlchemyがデータベースに作成する接続をチェックしています。Pythonを終了せずにそれらを閉じることができません。

pythonコンソールでこのコードを実行すると、pythonを終了するまでセッションが開かれたままになります。

_from sqlalchemy.orm import sessionmaker
from models import OneTable, get_engine

engine = get_engine(database="mydb")
session = sessionmaker(bind=engine)()

results = session.query(OneTable.company_name).all()

# some work with the data #

session.close()
_

そして、それを閉じることがわかった唯一の回避策は、最後にengine.dispose()を呼び出すことです。

上記のリンクのコメントによると、私の質問は次のとおりです。

  • セッションを閉じるためにengine.dispose()が必要なのはなぜですか?
  • session.close()では十分ではありませんか?
52
fedorqui

ここでは、「セッション」という言葉に関して中心的な混乱があります。ここではわかりませんが、 SQLAlchemy SessionMySQL @@ session を混同しているように見えます。これは、最初にMySQLへの接続時と切断時。

これらの2つの概念はではなく同じです。 SQLAlchemyセッションは通常、特定のデータベース接続での1つ以上のトランザクションのスコープを表します。

したがって、文字通り尋ねられたあなたの質問に対する答えは、session.close()、つまり「SQLAlchemyセッションを適切に閉じる方法」を呼び出すことです。

ただし、質問の残りの部分では、特定のSessionが閉じられたときに、実際のDBAPI接続も閉じられるようにする機能が必要であることを示しています。

これが基本的に意味するのは、 connection pooling を無効にすることです。他の回答が言及しているように、これは十分簡単です NullPoolを使用

68
zzzeek

session.close()は、エンジンの接続プールに接続を戻し、接続を閉じません。

engine.dispose()は、接続プールのすべての接続を閉じます。

_poolclass=NullPool_を設定すると、エンジンは接続プールを使用しません。したがって、接続(SQLAlchemyセッション)はsession.close()の直後に閉じます。

49
julivico