Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 871ad9f

Browse files
Got the global init and db creation working in sqlalchemy
1 parent 3e9adeb commit 871ad9f

File tree

7 files changed

+75
-3
lines changed

7 files changed

+75
-3
lines changed

‎code/ch7-databases/.idea/ch7-databases.iml‎

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# noinspection PyUnresolvedReferences
2+
from data.package import Package
3+
# noinspection PyUnresolvedReferences
4+
from data.user import User
5+
# noinspection PyUnresolvedReferences
6+
from data.release import Release
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from pathlib import Path
2+
from typing import Callable, Optional
3+
4+
import sqlalchemy as sa
5+
import sqlalchemy.orm as orm
6+
from sqlalchemy.orm import Session
7+
8+
from data.modelbase import SqlAlchemyBase
9+
10+
__factory: Optional[Callable[[], Session]] = None
11+
12+
13+
def global_init(db_file: str):
14+
global __factory
15+
16+
if __factory:
17+
return
18+
19+
if not db_file or not db_file.strip():
20+
raise Exception("You must specify a db file.")
21+
22+
folder = Path(db_file).parent
23+
folder.mkdir(parents=True, exist_ok=True)
24+
25+
conn_str = 'sqlite:///' + db_file.strip()
26+
print("Connecting to DB with {}".format(conn_str))
27+
28+
# Adding check_same_thread = False after the recording. This can be an issue about
29+
# creating / owner thread when cleaning up sessions, etc. This is a sqlite restriction
30+
# that we probably don't care about in this example.
31+
engine = sa.create_engine(conn_str, echo=False, connect_args={"check_same_thread": False})
32+
__factory = orm.sessionmaker(bind=engine)
33+
34+
# noinspection PyUnresolvedReferences
35+
import data.__all_models
36+
37+
SqlAlchemyBase.metadata.create_all(engine)
38+
39+
40+
def create_session() -> Session:
41+
global __factory
42+
43+
if not __factory:
44+
raise Exception("You must call global_init() before using this method.")
45+
46+
session: Session = __factory()
47+
session.expire_on_commit = False
48+
49+
return session
50+

‎code/ch7-databases/data/modelbase.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import sqlalchemy.ext.declarative
2+
3+
SqlAlchemyBase = sqlalchemy.ext.declarative.declarative_base()

‎code/ch7-databases/db/pypi.sqlite‎

Whitespace-only changes.

‎code/ch7-databases/main.py‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
from pathlib import Path
2+
13
import fastapi
24
import fastapi_chameleon
35
import uvicorn
46
from starlette.staticfiles import StaticFiles
57

8+
from data import db_session
69
from views import account
710
from views import home
811
from views import packages
@@ -18,6 +21,12 @@ def main():
1821
def configure(dev_mode: bool):
1922
configure_templates(dev_mode)
2023
configure_routes()
24+
configure_db(dev_mode)
25+
26+
27+
def configure_db(dev_mode: bool):
28+
file = (Path(__file__).parent / 'db' / 'pypi.sqlite').absolute()
29+
db_session.global_init(file.as_posix())
2130

2231

2332
def configure_templates(dev_mode: bool):

‎code/ch7-databases/requirements.txt‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
fastapi
2-
uvicorn
1+
fastapi==0.63.0
2+
uvicorn==0.13.3
33
aiofiles
44
python-multipart
55

66
git+https://github.com/mikeckennedy/fastapi-chameleon
77

8-
starlette
8+
starlette==0.13.6
9+
SQLAlchemy==1.3.22

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /