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()