mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
from sqlalchemy import create_engine
|
|
from contextlib import contextmanager
|
|
from backend.app.config import get_settings
|
|
from sqlmodel import Session
|
|
|
|
connection_string = (
|
|
"postgresql+{drivername}://{username}:{password}@{server}:{port}/{dbname}"
|
|
)
|
|
db_string = connection_string.format(
|
|
drivername="psycopg2", # You'll need to use psycopg2 driver for PostgreSQL
|
|
username=get_settings().DB_USERNAME,
|
|
password=get_settings().DB_PASSWORD,
|
|
server=get_settings().DB_HOST,
|
|
port=get_settings().DB_PORT,
|
|
dbname=get_settings().DB_NAME,
|
|
)
|
|
|
|
# db_engine = create_engine(db_string, pool_size=5, max_overflow=5)
|
|
|
|
# Adjusted database connection to decease pool size for serverless environments (from lambda) so that
|
|
# each lambda doesn't hog all connections
|
|
db_engine = create_engine(
|
|
db_string,
|
|
pool_size=3,
|
|
max_overflow=5, # Limit the number of extra connections. With this and pool size, we allow 1 connection per lambda
|
|
pool_pre_ping=True,
|
|
pool_recycle=300, # Forces SQLAlchemy to close and reopen any connection older than 300 seconds
|
|
)
|
|
|
|
|
|
def get_db_session():
|
|
if db_engine is None:
|
|
raise RuntimeError(
|
|
"Database is not configured. Set DATABASE_URL in environment variables."
|
|
)
|
|
return Session(db_engine)
|
|
|
|
|
|
@contextmanager
|
|
def db_session():
|
|
session = Session(db_engine)
|
|
try:
|
|
yield session
|
|
session.commit()
|
|
except Exception:
|
|
session.rollback()
|
|
raise
|
|
finally:
|
|
session.close()
|
|
|
|
|
|
@contextmanager
|
|
def db_read_session():
|
|
session = Session(db_engine, expire_on_commit=False)
|
|
try:
|
|
yield session
|
|
finally:
|
|
session.close()
|