|
4 | 4 | from typing import TYPE_CHECKING, Callable, Optional, Union, cast |
5 | 5 |
|
6 | 6 | from sqlalchemy.ext.asyncio import AsyncConnection, AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine |
| 7 | +from sqlalchemy.orm import sessionmaker as sync_sessionmaker |
7 | 8 |
|
8 | 9 | from advanced_alchemy._listeners import set_async_context |
9 | 10 | from advanced_alchemy.config.common import ( |
@@ -162,14 +163,20 @@ def create_session_maker(self) -> "Callable[[], AsyncSession]": |
162 | 163 | "async_sessionmaker[AsyncSession]", |
163 | 164 | self.session_maker, # pyright: ignore[reportUnknownMemberType] |
164 | 165 | ) |
| 166 | + |
| 167 | + # async_sessionmaker does not support Session-level events directly. |
| 168 | + # Create a sync sessionmaker, register events on it, and inject it |
| 169 | + # as sync_session_class so events fire on the underlying sync Session. |
| 170 | + sync_maker = sync_sessionmaker() |
165 | 171 | if self.enable_file_object_listener: |
166 | | - event.listen(session_maker, "before_flush", AsyncFileObjectListener.before_flush) |
167 | | - event.listen(session_maker, "after_commit", AsyncFileObjectListener.after_commit) |
168 | | - event.listen(session_maker, "after_rollback", AsyncFileObjectListener.after_rollback) |
| 172 | + event.listen(sync_maker, "before_flush", AsyncFileObjectListener.before_flush) |
| 173 | + event.listen(sync_maker, "after_commit", AsyncFileObjectListener.after_commit) |
| 174 | + event.listen(sync_maker, "after_rollback", AsyncFileObjectListener.after_rollback) |
169 | 175 | if self.enable_touch_updated_timestamp_listener: |
170 | | - event.listen(session_maker, "before_flush", touch_updated_timestamp) |
171 | | - event.listen(session_maker, "after_commit", AsyncCacheListener.after_commit) |
172 | | - event.listen(session_maker, "after_rollback", AsyncCacheListener.after_rollback) |
| 176 | + event.listen(sync_maker, "before_flush", touch_updated_timestamp) |
| 177 | + event.listen(sync_maker, "after_commit", AsyncCacheListener.after_commit) |
| 178 | + event.listen(sync_maker, "after_rollback", AsyncCacheListener.after_rollback) |
| 179 | + session_maker.configure(sync_session_class=sync_maker) |
173 | 180 |
|
174 | 181 | if self.session_maker is None: # pyright: ignore |
175 | 182 | msg = "Session maker was not initialized." # type: ignore[unreachable] |
|
0 commit comments