fastapi-async-sqlalchemy 0.7.0.dev1__py3-none-any.whl → 0.7.0.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fastapi_async_sqlalchemy/__init__.py +1 -1
- fastapi_async_sqlalchemy/middleware.py +38 -37
- {fastapi_async_sqlalchemy-0.7.0.dev1.dist-info → fastapi_async_sqlalchemy-0.7.0.dev2.dist-info}/METADATA +1 -1
- fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/RECORD +9 -0
- fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/RECORD +0 -9
- {fastapi_async_sqlalchemy-0.7.0.dev1.dist-info → fastapi_async_sqlalchemy-0.7.0.dev2.dist-info}/LICENSE +0 -0
- {fastapi_async_sqlalchemy-0.7.0.dev1.dist-info → fastapi_async_sqlalchemy-0.7.0.dev2.dist-info}/WHEEL +0 -0
- {fastapi_async_sqlalchemy-0.7.0.dev1.dist-info → fastapi_async_sqlalchemy-0.7.0.dev2.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
from asyncio import Task
|
|
3
2
|
from contextvars import ContextVar
|
|
4
3
|
from typing import Dict, Optional, Union
|
|
5
4
|
|
|
@@ -22,6 +21,9 @@ def create_middleware_and_session_proxy():
|
|
|
22
21
|
_Session: Optional[async_sessionmaker] = None
|
|
23
22
|
_session: ContextVar[Optional[AsyncSession]] = ContextVar("_session", default=None)
|
|
24
23
|
_multi_sessions_ctx: ContextVar[bool] = ContextVar("_multi_sessions_context", default=False)
|
|
24
|
+
_task_session_ctx: ContextVar[Optional[AsyncSession]] = ContextVar(
|
|
25
|
+
"_task_session_ctx", default=None
|
|
26
|
+
)
|
|
25
27
|
_commit_on_exit_ctx: ContextVar[bool] = ContextVar("_commit_on_exit_ctx", default=False)
|
|
26
28
|
# Usage of context vars inside closures is not recommended, since they are not properly
|
|
27
29
|
# garbage collected, but in our use case context var is created on program startup and
|
|
@@ -90,28 +92,26 @@ def create_middleware_and_session_proxy():
|
|
|
90
92
|
```
|
|
91
93
|
"""
|
|
92
94
|
commit_on_exit = _commit_on_exit_ctx.get()
|
|
93
|
-
|
|
94
|
-
if
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
task.add_done_callback(cleanup)
|
|
114
|
-
return task._db_session # type: ignore
|
|
95
|
+
session = _task_session_ctx.get()
|
|
96
|
+
if session is None:
|
|
97
|
+
session = _Session()
|
|
98
|
+
_task_session_ctx.set(session)
|
|
99
|
+
|
|
100
|
+
async def cleanup():
|
|
101
|
+
try:
|
|
102
|
+
if commit_on_exit:
|
|
103
|
+
await session.commit()
|
|
104
|
+
except Exception:
|
|
105
|
+
await session.rollback()
|
|
106
|
+
raise
|
|
107
|
+
finally:
|
|
108
|
+
await session.close()
|
|
109
|
+
_task_session_ctx.set(None)
|
|
110
|
+
|
|
111
|
+
task = asyncio.current_task()
|
|
112
|
+
if task is not None:
|
|
113
|
+
task.add_done_callback(lambda t: asyncio.create_task(cleanup()))
|
|
114
|
+
return session
|
|
115
115
|
else:
|
|
116
116
|
session = _session.get()
|
|
117
117
|
if session is None:
|
|
@@ -139,23 +139,24 @@ def create_middleware_and_session_proxy():
|
|
|
139
139
|
if self.multi_sessions:
|
|
140
140
|
self.multi_sessions_token = _multi_sessions_ctx.set(True)
|
|
141
141
|
self.commit_on_exit_token = _commit_on_exit_ctx.set(self.commit_on_exit)
|
|
142
|
-
|
|
143
|
-
|
|
142
|
+
else:
|
|
143
|
+
self.token = _session.set(_Session(**self.session_args))
|
|
144
144
|
return type(self)
|
|
145
145
|
|
|
146
146
|
async def __aexit__(self, exc_type, exc_value, traceback):
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
147
|
+
if self.multi_sessions:
|
|
148
|
+
_multi_sessions_ctx.reset(self.multi_sessions_token)
|
|
149
|
+
_commit_on_exit_ctx.reset(self.commit_on_exit_token)
|
|
150
|
+
else:
|
|
151
|
+
session = _session.get()
|
|
152
|
+
try:
|
|
153
|
+
if exc_type is not None:
|
|
154
|
+
await session.rollback()
|
|
155
|
+
elif self.commit_on_exit:
|
|
156
|
+
await session.commit()
|
|
157
|
+
finally:
|
|
158
|
+
await session.close()
|
|
159
|
+
_session.reset(self.token)
|
|
159
160
|
|
|
160
161
|
return SQLAlchemyMiddleware, DBSession
|
|
161
162
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
fastapi_async_sqlalchemy/__init__.py,sha256=uBiMzBBYVuNC52ekhbIasBTLsIhSvVyXY2KXD8nOWuQ,143
|
|
2
|
+
fastapi_async_sqlalchemy/exceptions.py,sha256=dH3xjPE7B6kgq8L3LvxK-MsGZ_ZnW2WH2drLkK2oD-4,887
|
|
3
|
+
fastapi_async_sqlalchemy/middleware.py,sha256=z3lPmnIihKyRfy34qE2z-38KuxFSXnVVcy_rg_S6IwM,6900
|
|
4
|
+
fastapi_async_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/LICENSE,sha256=OhSfEMY0WqZhq41M6mLmkuFloAG7ZJYKfryF2jyxkfY,1108
|
|
6
|
+
fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/METADATA,sha256=ANbR70mznxKwilOJ4OmYPVQ0OjmntfTdXr-SFcbL2eU,6831
|
|
7
|
+
fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
|
8
|
+
fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/top_level.txt,sha256=po-P5Tif35GmAaUR0mgZr5uBwN91iAgszaKI_r4ZTZA,25
|
|
9
|
+
fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/RECORD,,
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
fastapi_async_sqlalchemy/__init__.py,sha256=SssNn_DOQkhXabDQJJdvgRKMvL12CXPZiSqFxl1n1lg,143
|
|
2
|
-
fastapi_async_sqlalchemy/exceptions.py,sha256=dH3xjPE7B6kgq8L3LvxK-MsGZ_ZnW2WH2drLkK2oD-4,887
|
|
3
|
-
fastapi_async_sqlalchemy/middleware.py,sha256=Fk5aAkgqjLH_HWTa-ELlYL3vFlaSlIMyG2xpG7AarDw,6916
|
|
4
|
-
fastapi_async_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
-
fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/LICENSE,sha256=OhSfEMY0WqZhq41M6mLmkuFloAG7ZJYKfryF2jyxkfY,1108
|
|
6
|
-
fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/METADATA,sha256=COfeGoIlIPXulpANj8vL4Mtn9rtUerNGQ2G3bD2PanM,6831
|
|
7
|
-
fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
|
8
|
-
fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/top_level.txt,sha256=po-P5Tif35GmAaUR0mgZr5uBwN91iAgszaKI_r4ZTZA,25
|
|
9
|
-
fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|