SQLAlchemyのSessionとin_transactionを調べた
SQLAlchemy でトランザクション管理をするにあたり、SQLAlchemy であつかう Session について理解する必要があったので検証しました。また、SQLAlchemy 1.4 Documentationに書いてあったin_transaction
の挙動を確認したかったので、ついでに動作検証しました。
ソースコード
https://github.com/mt2m10/session-check-code-in-SQLAlchemy
検証内容
sessionmaker
とscoped_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
が返ってくる