Корректное использование сессий в 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()
но, тогда получается что закрытие сессии бы дублировалось? Или я что-то путаю?