Add database migration for schema updates

When the registry server starts, it now automatically adds any missing
columns to existing tables. This prevents 500 errors when publishing
to a database created before newer columns were added.

Columns added by migration:
- scrutiny_status, scrutiny_report (tool scrutiny)
- source, source_url, source_json (tool attribution)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
rob 2026-01-13 21:48:38 -04:00
parent 0462750b88
commit 63149aec07
1 changed files with 33 additions and 0 deletions

View File

@ -281,6 +281,39 @@ def connect_db(path: Path | None = None) -> sqlite3.Connection:
def init_db(conn: sqlite3.Connection) -> None:
conn.executescript(SCHEMA_SQL)
conn.commit()
# Run migrations for existing databases
migrate_db(conn)
def migrate_db(conn: sqlite3.Connection) -> None:
"""Add missing columns to existing tables (for schema updates)."""
# Get existing columns in tools table
cursor = conn.execute("PRAGMA table_info(tools)")
existing_cols = {row[1] for row in cursor.fetchall()}
# Columns that may need to be added (column_name, type, default)
migrations = [
("scrutiny_status", "TEXT", "'pending'"),
("scrutiny_report", "TEXT", "NULL"),
("source", "TEXT", "NULL"),
("source_url", "TEXT", "NULL"),
("source_json", "TEXT", "NULL"),
]
for col_name, col_type, default in migrations:
if col_name not in existing_cols:
try:
conn.execute(f"ALTER TABLE tools ADD COLUMN {col_name} {col_type} DEFAULT {default}")
conn.commit()
except sqlite3.OperationalError:
pass # Column might already exist or other issue
# Ensure indexes exist
try:
conn.execute("CREATE INDEX IF NOT EXISTS idx_tools_owner ON tools(owner)")
conn.commit()
except sqlite3.OperationalError:
pass
def query_one(conn: sqlite3.Connection, sql: str, params: Iterable | None = None):