Files
yrtv/tools/inspect_sqlite_schema.py

64 lines
2.0 KiB
Python

import sqlite3
from pathlib import Path
def _connect(db_path: Path) -> sqlite3.Connection:
conn = sqlite3.connect(str(db_path))
conn.row_factory = sqlite3.Row
return conn
def _list_tables(conn: sqlite3.Connection) -> list[str]:
cur = conn.execute(
"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name"
)
return [r["name"] for r in cur.fetchall()]
def _table_columns(conn: sqlite3.Connection, table: str) -> list[tuple[int, str, str, int, str, int]]:
cur = conn.execute(f"PRAGMA table_info({table})")
rows = cur.fetchall()
return [(r[0], r[1], r[2], r[3], r[4], r[5]) for r in rows]
def inspect(db_path: Path, tables: list[str] | None = None) -> None:
print(f"\n=== {db_path} ===")
if not db_path.exists():
print("NOT FOUND")
return
conn = _connect(db_path)
try:
all_tables = _list_tables(conn)
print(f"tables={len(all_tables)}")
if tables is None:
tables = all_tables
for t in tables:
if t not in all_tables:
print(f"\n-- {t} (missing)")
continue
cols = _table_columns(conn, t)
print(f"\n-- {t} cols={len(cols)}")
for cid, name, ctype, notnull, dflt, pk in cols:
print(f"{cid:>3} {name:<40} {ctype:<12} notnull={notnull} pk={pk} dflt={dflt}")
finally:
conn.close()
if __name__ == "__main__":
base_dir = Path(__file__).resolve().parents[1]
l2 = base_dir / "database" / "L2" / "L2.db"
l3 = base_dir / "database" / "L3" / "L3.db"
web = base_dir / "database" / "Web" / "Web_App.sqlite"
inspect(
l3,
tables=[
"dm_player_features",
"dm_player_match_history",
"dm_player_map_stats",
"dm_player_weapon_stats",
],
)
inspect(web)
inspect(l2, tables=["dim_players", "fact_matches", "fact_match_players", "fact_match_rounds"])