SQL-сессии и транзакции#
Модуль: restalchemy.storage.sql.sessions
Модуль определяет классы сессий для PostgreSQL и MySQL, кэш запросов и вспомогательные функции для управления сессиями.
SessionQueryCache#
SessionQueryCache — кэш результатов запросов на уровне одной сессии.
- Строит хэш на основе SQL-выражения и параметров.
- Кэширует результаты
get_all()иquery(). - Повторно использует результат при идентичном запросе в рамках сессии.
Используется внутри PgSQLSession и MySQLSession, когда включён флаг cache=True.
PgSQLSession#
PgSQLSession оборачивает соединение и курсор PostgreSQL:
- Получает соединения через
PgSQLEngine.get_connection(). - Использует
pg_rows.dict_rowдля возврата строк в виде словарей. - Предоставляет методы
execute(),execute_many(),commit(),rollback(),close(). - Реализует
batch_insert(models)иbatch_delete(models): - Проверяет, что все модели одного типа.
- Формирует пакетные операции через диалект
pgsql.
Обычно управляется через:
engine.session_manager()(изAbstractEngine), илиsessions.session_manager(engine, session=None).
MySQLSession#
MySQLSession аналогичен PgSQLSession, но:
- Использует MySQL-соединения из
MySQLEngine. - Работает с курсорами
mysql.connector(dictionary=True). - Использует диалект
mysql(MySQLInsert,MySQLBatchDeleteи др.).
Также поддерживает:
batch_insert(models)иbatch_delete(models).- Преобразование типичных ошибок (deadlock, нарушения целостности) в исключения слоя хранения.
session_manager#
Есть два родственных механизма управления сессиями:
engines.AbstractEngine.session_manager()sessions.session_manager(engine, session=None)
engine.session_manager():
- Если сессия не передана:
- Создаёт новую сессию через
engine.get_session(). - Вызывает
commit()при успешном завершении блока. - Вызывает
rollback()при исключении. - Закрывает сессию после выхода из блока.
- Если сессия передана, просто yield-ит её без дополнительной логики.
Пример:
from restalchemy.storage.sql import engines
engine = engines.engine_factory.get_engine()
with engine.session_manager() as session:
foo = FooModel(foo_field1=42)
foo.save(session=session)
sessions.session_manager(engine, session=None) реализует похожую логику на уровне модуля sessions.
SessionThreadStorage#
SessionThreadStorage — потокобезопасное хранилище сессий:
- Хранит одну сессию на поток.
- Методы:
get_session()— вернуть сессию или броситьSessionNotFound.store_session(session)— сохранить сессию, броситьSessionConflict, если уже есть.remove_session()/pop_session()— удалить или получить+удалить сессию.
Движки используют SessionThreadStorage как хранилище сессий, чтобы:
- Одна и та же сессия могла использоваться несколькими операциями в пределах одного потока.
- Код верхнего уровня мог интегрировать сессии RESTAlchemy в существующую систему управления транзакциями.