| import logging |
| import os |
| from dotenv import load_dotenv |
| from sqlalchemy import create_engine, event |
| from sqlalchemy.orm import sessionmaker |
| from src.db.schemas.models import Base |
| from src.utils.logger import Logger |
|
|
| logger = Logger("init_db", see_time=True, console_log=True) |
| load_dotenv() |
|
|
| |
| DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///chat_database.db") |
|
|
| |
| if DATABASE_URL.startswith('postgresql'): |
| |
| engine = create_engine( |
| DATABASE_URL, |
| pool_size=10, |
| max_overflow=20, |
| pool_pre_ping=True, |
| pool_recycle=300 |
| ) |
| is_postgresql = True |
| logger.log_message("Using PostgreSQL database engine", logging.INFO) |
| else: |
| |
| engine = create_engine(DATABASE_URL) |
| is_postgresql = False |
| |
| @event.listens_for(engine, "connect") |
| def set_sqlite_pragma(dbapi_connection, connection_record): |
| cursor = dbapi_connection.cursor() |
| cursor.execute("PRAGMA foreign_keys=ON") |
| cursor.close() |
| logger.log_message("Using SQLite database engine", logging.INFO) |
|
|
| |
| Session = sessionmaker(bind=engine) |
| session_factory = Session |
|
|
| |
| def init_db(): |
| |
| Base.metadata.create_all(engine) |
| logger.log_message("Database and tables created successfully.", logging.INFO) |
| logger.log_message(f"Models: {Base.metadata.tables.keys()}", logging.INFO) |
|
|
| |
| def get_session(): |
| return Session() |
|
|
| def get_db(): |
| db = Session() |
| try: |
| yield db |
| except Exception as e: |
| logger.log_message(f"Error getting database session: {e}", logging.ERROR) |
| finally: |
| db.close() |
|
|
| |
| def is_postgres_db(): |
| return is_postgresql |
|
|
| if __name__ == "__main__": |
| init_db() |