Spaces:
Paused
Paused
File size: 1,816 Bytes
de262f8 635dd02 de262f8 635dd02 de262f8 635dd02 de262f8 635dd02 de262f8 635dd02 de262f8 635dd02 de262f8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | """
Database initialisation script — SQLite edition.
Usage (inside the backend container):
python -m scripts.init_db
Creates all SQLAlchemy-managed tables (users, roles, user_roles,
query_logs, evaluation_results) and seeds the default roles.
Safe to re-run — create_all uses IF NOT EXISTS semantics; role
upsert uses merge() so duplicates are ignored.
"""
import logging
import os
from sqlalchemy import create_engine, select
from sqlalchemy.orm import Session
from app.config import get_settings
from app.models import Base, Role
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
def init_db():
settings = get_settings()
# Convert async URL to sync URL for the init script
sync_url = settings.database_url.replace("sqlite+aiosqlite", "sqlite")
logger.info("Initialising database at: %s", sync_url)
# Ensure the directory exists (e.g. /data on HF Spaces)
db_path = sync_url.replace("sqlite:///", "")
db_dir = os.path.dirname(db_path)
if db_dir:
os.makedirs(db_dir, exist_ok=True)
engine = create_engine(sync_url, connect_args={"check_same_thread": False})
Base.metadata.create_all(engine)
logger.info("Tables created (or already exist).")
# Seed default roles
with Session(engine) as session:
for role_name in ("researcher", "guest"):
existing = session.scalar(select(Role).where(Role.name == role_name))
if existing is None:
session.add(Role(name=role_name))
logger.info("Seeded role: %s", role_name)
else:
logger.info("Role already exists: %s", role_name)
session.commit()
logger.info("Database initialised successfully.")
if __name__ == "__main__":
init_db()
|