Skip to content

Commit 9ffa157

Browse files
committed
docs: Document how to get an SQLAlchemy session
1 parent 3e9c746 commit 9ffa157

3 files changed

Lines changed: 42 additions & 4 deletions

File tree

README.md

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
[![CircleCI](https://circleci.com/gh/dialoguemd/fastapi-sqla.svg?style=svg&circle-token=998482f269270ee521aa54f2accbee2e22943743)](https://circleci.com/gh/dialoguemd/fastapi-sqla)
55
[![codecov](https://codecov.io/gh/dialoguemd/fastapi-sqla/branch/master/graph/badge.svg?token=BQHLryClIn)](https://codecov.io/gh/dialoguemd/fastapi-sqla)
66

7-
A highly opinionated SQLAlchemy extension for FastAPI:
7+
A highly opinionated [SQLAlchemy] extension for [FastAPI]:
88

99
* Setup using environment variables to connect on DB;
1010
* `fastapi_sqla.Base` a declarative base class to reflect DB tables at startup;
@@ -49,6 +49,13 @@ class Entity(Base):
4949

5050
### Getting an sqla session
5151

52+
#### Using dependency injection
53+
54+
Use [FastAPI dependency injection] to get a session as a parameter of a path operation
55+
function.
56+
SQLAlchemy session is committed before response is returned or rollbacked if any
57+
exception occurred:
58+
5259
```python
5360
from fastapi import APIRouter, Depends
5461
from fastapi_sqla import Session
@@ -61,6 +68,30 @@ def example(session: Session = Depends()):
6168
return session.execute("SELECT now()").scalar()
6269
```
6370

71+
#### Using a context manager
72+
73+
When needing a session outside of a path operation, like when using
74+
[FastAPI background tasks], use `fastapi_sqla.open_session` context manager.
75+
SQLAlchemy session is committed when exiting context or rollbacked if any exception
76+
occurred:
77+
78+
```python
79+
from fastapi import APIRouter, BackgroundTasks
80+
from fastapi_sqla import open_session
81+
82+
router = APIRouter()
83+
84+
85+
@router.get("/example")
86+
def example(bg: BackgroundTasks):
87+
bg.add_task(run_bg)
88+
89+
90+
def run_bg():
91+
with open_session() as session:
92+
session.execute("SELECT now()").scalar()
93+
```
94+
6495
### Pagination
6596

6697
```python
@@ -87,10 +118,11 @@ def all_users(session: Session = Depends(), paginate: Paginate = Depends()):
87118
```
88119

89120
By default:
121+
90122
* It returns pages of 10 items, up to 100 items;
91123
* Total number of items in the collection is queried using [`Query.count`]
92124

93-
### Custom pagination
125+
#### Customize pagination
94126

95127
You can customize:
96128
- Minimum and maximum number of items per pages;
@@ -256,3 +288,7 @@ It returns the path of `alembic.ini` configuration file. By default, it returns
256288
[`sqlalchemy.create_engine`]: https://docs.sqlalchemy.org/en/13/core/engines.html?highlight=create_engine#sqlalchemy.create_engine
257289
[`Query.count`]: https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.orm.query.Query.count
258290
[pytest options]: https://docs.pytest.org/en/stable/reference.html#confval-usefixtures
291+
[FastAPI]: https://fastapi.tiangolo.com/
292+
[FastAPI dependency injection]: https://fastapi.tiangolo.com/tutorial/dependencies/
293+
[FastAPI background tasks]: https://fastapi.tiangolo.com/tutorial/background-tasks/
294+
[SQLAlchemy]: http://sqlalchemy.org/

fastapi_sqla/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
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 as SqlaSession, sessionmaker
15+
from sqlalchemy.orm.session import Session as SqlaSession
16+
from sqlalchemy.orm.session import sessionmaker
1617

17-
__all__ = ["Base", "Page", "Paginate", "Session", "setup"]
18+
__all__ = ["Base", "Page", "Paginate", "Session", "open_session", "setup"]
1819

1920
logger = structlog.get_logger(__name__)
2021

tests/test_pagination.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ def test_Pagination_with_custom_count(
113113
@fixture
114114
def app(user_cls, note_cls):
115115
from sqlalchemy.orm import joinedload
116+
116117
from fastapi_sqla import Page, Paginate, Session, setup
117118

118119
app = FastAPI()

0 commit comments

Comments
 (0)