Skip to content

Commit 03369c5

Browse files
store db reader/writer dependencies in starlette app.state (#3)
* store db reader/writer dependencies in starlette app.state * remove useless if * shutdown reader on app shutdown, remove reader/writer deps * Revert "shutdown reader on app shutdown, remove reader/writer deps" Co-authored-by: Jeff Albrecht <[email protected]>
1 parent 933e939 commit 03369c5

File tree

2 files changed

+13
-29
lines changed

2 files changed

+13
-29
lines changed

stac_api/app.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from . import settings
66
from .resources import mgmt, collection, conformance, item
7-
from .utils import dependencies
87

98

109
app = FastAPI()
@@ -18,18 +17,18 @@
1817
@app.on_event("startup")
1918
async def on_startup():
2019
"""Create database engines and sessions on startup"""
21-
dependencies.ENGINE_READER = create_engine(settings.SQLALCHEMY_DATABASE_READER)
22-
dependencies.ENGINE_WRITER = create_engine(settings.SQLALCHEMY_DATABASE_WRITER)
23-
dependencies.DB_READER = sessionmaker(
24-
autocommit=False, autoflush=False, bind=dependencies.ENGINE_READER
20+
app.state.ENGINE_READER = create_engine(settings.SQLALCHEMY_DATABASE_READER)
21+
app.state.ENGINE_WRITER = create_engine(settings.SQLALCHEMY_DATABASE_WRITER)
22+
app.state.DB_READER = sessionmaker(
23+
autocommit=False, autoflush=False, bind=app.state.ENGINE_READER
2524
)
26-
dependencies.DB_WRITER = sessionmaker(
27-
autocommit=False, autoflush=False, bind=dependencies.ENGINE_WRITER
25+
app.state.DB_WRITER = sessionmaker(
26+
autocommit=False, autoflush=False, bind=app.state.ENGINE_WRITER
2827
)
2928

3029

3130
@app.on_event("shutdown")
3231
async def on_shutdown():
3332
"""Dispose of database engines and sessions on app shutdown"""
34-
dependencies.ENGINE_READER.dispose()
35-
dependencies.ENGINE_WRITER.dispose()
33+
app.state.ENGINE_READER.dispose()
34+
app.state.ENGINE_WRITER.dispose()

stac_api/utils/dependencies.py

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
from dataclasses import dataclass
2-
from typing import Callable, List, Optional
2+
from typing import Callable, List
33

4-
from sqlalchemy.engine import Engine
54
from sqlalchemy.orm import Session
65
from starlette.requests import Request
76

87

9-
ENGINE_READER: Optional[Engine] = None
10-
ENGINE_WRITER: Optional[Engine] = None
11-
DB_READER: Optional[Session] = None
12-
DB_WRITER: Optional[Session] = None
13-
14-
158
@dataclass
169
class DatabaseConnectionError(Exception):
1710
message: str
@@ -32,27 +25,19 @@ def _parse(request: Request):
3225
return _parse
3326

3427

35-
def database_reader_factory() -> Session:
28+
def database_reader_factory(request: Request) -> Session:
3629
"""Instantiate the database reader session"""
3730
try:
38-
if not DB_READER:
39-
raise DatabaseConnectionError(
40-
message="Database engine has not been created"
41-
)
42-
db = DB_READER()
31+
db = request.app.state.DB_READER()
4332
yield db
4433
finally:
4534
db.close()
4635

4736

48-
def database_writer_factory() -> Session:
37+
def database_writer_factory(request: Request) -> Session:
4938
"""Instantiate the database writer session"""
5039
try:
51-
if not DB_WRITER:
52-
raise DatabaseConnectionError(
53-
message="Database engine has not been created"
54-
)
55-
db = DB_WRITER()
40+
db = request.app.state.DB_WRITER()
5641
yield db
5742
finally:
5843
db.close()

0 commit comments

Comments
 (0)