Skip to content
Snippets Groups Projects
database.py 1.18 KiB
Newer Older
Daniel Schultz's avatar
Daniel Schultz committed
from sqlalchemy import Column, DateTime, create_engine, func, text
from sqlalchemy.engine.url import URL
from sqlalchemy.ext.declarative import declared_attr

# We need to ignore type checks on this line due to https://github.com/dropbox/sqlalchemy-stubs/issues/250
from sqlalchemy.orm import as_declarative, sessionmaker  # type: ignore

from service.core.settings import settings

database_url = URL(
    "postgresql",
    host=settings.PGHOST,
    username=settings.PGUSER,
    password=settings.PGPASSWORD,
    database=settings.PGDATABASE,
    port=settings.PGPORT,
    query={},
)

engine = create_engine(database_url)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)


@as_declarative()
class Base:
    @declared_attr
    def created_at(cls):
        return Column(
            DateTime(timezone=True), nullable=False, server_default=func.now()
        )

    @declared_attr
    def updated_at(cls):
        return Column(
            DateTime(timezone=True), nullable=False, server_default=func.now()
        )


def get_db():
    db = SessionLocal()
    db.execute(text(f"set search_path to {settings.APP_SCHEMA}"))
    try:
        yield db
    finally:
        db.close()