Skip to content

Commit 309472a

Browse files
committed
Refactor settings to use DB_URL exclusively and added comments to database module
1 parent 0f33596 commit 309472a

File tree

3 files changed

+38
-35
lines changed

3 files changed

+38
-35
lines changed

.env.example

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
# DB_TYPE Options: sqlite, mysql
1+
# DB_TYPE Options: sqlite, mysql, postgresql
22
DB_TYPE=postgresql
3-
DB_NAME=fastapidb
4-
DB_USER=fastapiusr
5-
DB_PASSWORD=fastapipwd
6-
DB_HOST=localhost
7-
DB_PORT=5432
83
# Uncomment the line below if DB_TYPE=postgresql
94
DB_URL=postgresql://fastapiusr:fastapipwd@localhost:5432/fastapidb
105
# Uncomment the line below if DB_TYPE=sqlite

api/db/database.py

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,48 +6,59 @@
66

77
from api.utils.settings import BASE_DIR, settings
88

9-
DB_HOST = settings.DB_HOST
10-
DB_PORT = settings.DB_PORT
11-
DB_USER = settings.DB_USER
12-
DB_PASSWORD = settings.DB_PASSWORD
13-
DB_NAME = settings.DB_NAME
14-
DB_TYPE = settings.DB_TYPE
15-
169

1710
def get_db_engine(test_mode: bool = False): # type: ignore
18-
if DB_TYPE == "sqlite" or test_mode:
11+
"""Create a SQLAlchemy engine instance.
12+
13+
Args:
14+
test_mode (bool): If True, use a SQLite database for testing purposes.
15+
16+
Returns:
17+
Engine: SQLAlchemy engine instance.
18+
"""
19+
if settings.DB_TYPE == "sqlite" or test_mode:
20+
# If the database type is SQLite or we are in test mode, use a SQLite database
1921
BASE_PATH = f"sqlite:///{BASE_DIR}"
2022
DATABASE_URL = BASE_PATH + ("/test.db" if test_mode else "/db.sqlite3")
21-
22-
return create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
23-
elif DB_TYPE == "mysql":
24-
DATABASE_URL = (
25-
f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
26-
)
27-
elif DB_TYPE == "postgresql":
28-
DATABASE_URL = (
29-
f"postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
30-
)
3123
else:
32-
raise ValueError(f"Unsupported DB_TYPE: {DB_TYPE}")
24+
# For other database types, use the provided DATABASE_URL
25+
DATABASE_URL = settings.DB_URL
3326

34-
return create_engine(DATABASE_URL)
27+
return create_engine(
28+
DATABASE_URL,
29+
connect_args={"check_same_thread": False}
30+
if settings.DB_TYPE == "sqlite"
31+
else {},
32+
)
3533

3634

35+
# Create an engine instance
3736
engine = get_db_engine()
3837

38+
# Create a configured "Session" class
3939
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
4040

41+
# Create a configured "scoped_session" factory
4142
db_session = scoped_session(SessionLocal)
4243

44+
# Create a base class for declarative class definitions
4345
Base = declarative_base()
4446

4547

4648
def create_database():
49+
"""Create all tables in the database."""
4750
return Base.metadata.create_all(bind=engine)
4851

4952

5053
def get_db():
54+
"""Yield a database session.
55+
56+
This function provides a context manager for database sessions, ensuring that
57+
each session is properly closed after use.
58+
59+
Yields:
60+
Session: SQLAlchemy session instance.
61+
"""
5162
db = db_session()
5263
try:
5364
yield db

api/utils/settings.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from pathlib import Path
22

3-
from decouple import config
4-
from pydantic_settings import BaseSettings
3+
from pydantic_settings import BaseSettings, SettingsConfigDict
54

65
# Use this to build paths inside the project
76
BASE_DIR = Path(__file__).resolve().parent
@@ -10,13 +9,11 @@
109
class Settings(BaseSettings):
1110
"""Class to hold application's config values."""
1211

13-
# Database configurations
14-
DB_HOST: str = config("DB_HOST")
15-
DB_PORT: int = config("DB_PORT", cast=int)
16-
DB_USER: str = config("DB_USER")
17-
DB_PASSWORD: str = config("DB_PASSWORD")
18-
DB_NAME: str = config("DB_NAME")
19-
DB_TYPE: str = config("DB_TYPE")
12+
DB_TYPE: str
13+
DB_URL: str
2014

15+
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
2116

17+
18+
# Load settings from the .env file
2219
settings = Settings()

0 commit comments

Comments
 (0)