Skip to content

Commit f639f20

Browse files
committed
refactor!: Simplify Session API
fastapi_sqla.Session is used as a dependency directly. BREAKING CHANGE: * Removed `fastapi_sqla.with_session`. Use `fastapi_sqla.Session` instead.
1 parent 30e445f commit f639f20

4 files changed

Lines changed: 35 additions & 36 deletions

File tree

README.md

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,17 @@ class Entity(Base):
4747
__tablename__ = "table-name-in-db"
4848
```
4949

50-
### Getting an sqla orm session
50+
### Getting an sqla session
5151

5252
```python
5353
from fastapi import APIRouter, Depends
54-
from fastapi_sqla import Session, with_session
54+
from fastapi_sqla import Session
5555

5656
router = APIRouter()
5757

5858

5959
@router.get("/example")
60-
def example(session: Session = Depends(with_session)):
60+
def example(session: Session = Depends()):
6161
return session.execute("SELECT now()").scalar()
6262
```
6363

@@ -71,7 +71,6 @@ from fastapi_sqla import (
7171
PaginatedResult,
7272
Session,
7373
with_pagination,
74-
with_session,
7574
)
7675
from pydantic import BaseModel
7776

@@ -89,7 +88,7 @@ class User(BaseModel):
8988

9089
@router.get("/users", response_model=Paginated[User])
9190
def all_users(
92-
session: Session = Depends(with_session),
91+
session: Session = Depends(),
9392
paginated_result: PaginatedResult = Depends(with_pagination),
9493
):
9594
query = session.query(UserEntity)
@@ -116,7 +115,6 @@ from fastapi_sqla import (
116115
PaginatedResult,
117116
Pagination,
118117
Session,
119-
with_session,
120118
)
121119
from pydantic import BaseModel
122120
from sqlalchemy import func
@@ -147,7 +145,7 @@ with_custom_pagination = Pagination(
147145

148146
@router.get("/users", response_model=Paginated[User])
149147
def all_users(
150-
session: Session = Depends(with_session),
148+
session: Session = Depends(),
151149
paginated_result: PaginatedResult = Depends(with_custom_pagination),
152150
):
153151
query = session.query(UserEntity)

fastapi_sqla/__init__.py

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
from sqlalchemy import engine_from_config
1313
from sqlalchemy.ext.declarative import DeferredReflection, declarative_base
1414
from sqlalchemy.orm import Query as DbQuery
15-
from sqlalchemy.orm.session import Session, sessionmaker
15+
from sqlalchemy.orm.session import Session as SqlaSession, sessionmaker
1616

17-
__all__ = ["Base", "setup", "with_session"]
17+
__all__ = ["Base", "Session", "setup"]
1818

1919
logger = structlog.get_logger(__name__)
2020

@@ -40,6 +40,29 @@ class Base(declarative_base(cls=DeferredReflection)): # type: ignore
4040
__abstract__ = True
4141

4242

43+
class Session(SqlaSession):
44+
def __new__(cls, request: Request) -> SqlaSession:
45+
"""Yield the sqlalchmey session for that request.
46+
47+
It is meant to be used as a FastAPI dependency::
48+
49+
from fastapi import APIRouter, Depends
50+
from fastapi_sqla import Session
51+
52+
router = APIRouter()
53+
54+
@router.get("/users")
55+
def get_users(session: Session = Depends()):
56+
pass
57+
"""
58+
try:
59+
return request.scope[_SESSION_KEY]
60+
except KeyError: # pragma: no cover
61+
raise Exception(
62+
"No session found in request, please ensure you've setup fastapi_sqla."
63+
)
64+
65+
4366
@contextmanager
4467
def open_session() -> Session:
4568
"""Context manager that opens a session and properly closes session when exiting.
@@ -63,28 +86,6 @@ def open_session() -> Session:
6386
session.close()
6487

6588

66-
def with_session(request: Request) -> Session:
67-
"""Yield the sqlalchmey session for that request.
68-
69-
It is meant to be used as a FastAPI® dependency::
70-
71-
from er import sqla
72-
from fastapi import APIRouter, Depends
73-
74-
router = APIRouter()
75-
76-
@router.get("/users")
77-
def get_users(db: sqla.Session = Depends(sqla.with_session)):
78-
pass
79-
"""
80-
try:
81-
yield request.scope[_SESSION_KEY]
82-
except KeyError: # pragma: no cover
83-
raise Exception(
84-
"No session found in request, please ensure you've setup fastapi_sqla."
85-
)
86-
87-
8889
async def add_session_to_request(request: Request, call_next):
8990
"""Middleware which injects a new sqla session into every request.
9091
@@ -165,7 +166,7 @@ def Pagination(
165166
query_count: Callable[[Session, DbQuery], int] = _query_count,
166167
) -> Callable[[Session, int, int], PaginatedResult]:
167168
def dependency(
168-
session: Session = Depends(with_session),
169+
session: Session = Depends(),
169170
offset: int = Query(0, ge=0),
170171
limit: int = Query(min_page_size, ge=1, le=max_page_size),
171172
) -> PaginatedResult:

tests/test_middleware.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class User(Base):
3737

3838
@fixture
3939
def app(User):
40-
from fastapi_sqla import setup, with_session
40+
from fastapi_sqla import Session, setup
4141

4242
app = FastAPI()
4343
setup(app)
@@ -48,7 +48,7 @@ class UserIn(BaseModel):
4848
last_name: str
4949

5050
@app.post("/users")
51-
def create_user(user: UserIn, session=Depends(with_session)):
51+
def create_user(user: UserIn, session: Session = Depends()):
5252
session.add(User(**user.dict()))
5353
return {}
5454

tests/test_pagination.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def test_Pagination_with_custom_count(
113113
def app(user_cls, note_cls):
114114
from sqlalchemy.orm import joinedload
115115

116-
from fastapi_sqla import Paginated, Session, setup, with_pagination, with_session
116+
from fastapi_sqla import Paginated, Session, setup, with_pagination
117117

118118
app = FastAPI()
119119
setup(app)
@@ -129,7 +129,7 @@ class User(BaseModel):
129129

130130
@app.get("/users")
131131
def all_users(
132-
session: Session = Depends(with_session),
132+
session: Session = Depends(),
133133
paginated_result=Depends(with_pagination),
134134
reponse_model=Paginated[User],
135135
):

0 commit comments

Comments
 (0)