Корректное использование сессий в SQLAlchemy

На основе докумментации сформировал фабрику подключения к БД:

from sqlalchemy import URL
from sqlalchemy.orm import scoped_session, sessionmaker

url_object = URL.create(
    f"{os.environ['DIALECT']}+{os.environ['DRIVER']}",
    username=os.environ['USERNAME'],
    password=os.environ['PASSWORD'], 
    host=os.environ['HOST'],
    port=int(os.environ['PORT']),
    database=os.environ['DB'],
)

pymysql.install_as_MySQLdb()
engine = create_engine(url_object, pool_size=10, max_overflow=15)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))

правильно ли я понял, что теперь можно будет в любом модуле использовать db_session для работы с БД только его импортировав в нужное место другого модуля?:

db_session.add(...)
db_session.commit()
db_session.close() # это можно не вызывать, т.к.

либо

with db_session() as session_db:
    session_db.add(...)
    session_db.commit()

Или мне надо было организовать фабрику сессий в отдельной функци типа такого:

from sqlalchemy.orm import sessionmaker, Session
...
engine = create_engine(url_object, pool_size=10, max_overflow=15)

def db_session() -> Session:
    SessionLocal = sessionmaker(autoflush=False, bind=engine)
    try:
        db = SessionLocal()
        return db
    finally:
        db.close()

Ну и также работать:

db_session.add(...)
db_session.commit()
db_session.close() # это можно не вызывать, т.к.

либо

with db_session() as session_db:
    session_db.add(...)
    session_db.commit()

но, тогда получается что закрытие сессии бы дублировалось? Или я что-то путаю?


Ответы (0 шт):