コンテンツにスキップ

SQLAlchemyのSessionとin_transactionを調べた

SQLAlchemy でトランザクション管理をするにあたり、SQLAlchemy であつかう Session について理解する必要があったので検証しました。また、SQLAlchemy 1.4 Documentationに書いてあったin_transactionの挙動を確認したかったので、ついでに動作検証しました。

ソースコード

https://github.com/mt2m10/session-check-code-in-SQLAlchemy

検証内容

  • sessionmakerscoped_sessionの Session 生成の違い
  • in_transactionの挙動

検証環境

  • Windows 11
  • WSL2 (Ubuntu)

結果

SQLite を使って確認しました。

(session-check-code-in-SQLAlchemy) mah@DESKTOP-TQ41EI2:~/dev/session-check-code-in-SQLAlchemy$ python main.py
------------------------------------
main 開始
------------------------------------

トランザクションの確認
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5330>] transaction status: False
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e6920>] transaction status: False

[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5330>] transaction開始
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5330>] トランザクションを開始します

トランザクションの確認
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5330>] transaction status: True
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e6920>] transaction status: False

[$<sqlalchemy.orm.session.Session object at 0x7f0e284e6920>] transaction開始
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e6920>] トランザクションを開始します

トランザクションの確認
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5330>] transaction status: True
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e6920>] transaction status: True

------------------------------------
main 終了
------------------------------------

------------------------------------
main 開始
------------------------------------

トランザクションの確認
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] transaction status: False
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] transaction status: False

[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] transaction開始
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] トランザクションを開始します

トランザクションの確認
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] transaction status: True
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] transaction status: True

[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] transaction開始
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] 既にトランザクションが開始されてます

トランザクションの確認
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] transaction status: True
[$<sqlalchemy.orm.session.Session object at 0x7f0e284e5600>] transaction status: True

------------------------------------
main 終了
------------------------------------
  • sessionmakerは、sessionmaker()()のたびに新しいセッションを生成する
  • scoped_sessionは、複数回セッション生成しても同じセッションが返ってくる
  • in_transactionはトランザクション中ならTrue、トランザクション外ならFalseが返ってくる