fix(migration): ALTER TABLE to add new columns on existing supplementary tables
All checks were successful
Build and Push Docker Images / Build Backend (FastAPI) (push) Successful in 48s
Build and Push Docker Images / Build Frontend (Next.js) (push) Successful in 1m12s
Build and Push Docker Images / Build Integrator (push) Successful in 57s
Build and Push Docker Images / Build Kestra Init (push) Successful in 32s
Build and Push Docker Images / Trigger Portainer Update (push) Successful in 1s
All checks were successful
Build and Push Docker Images / Build Backend (FastAPI) (push) Successful in 48s
Build and Push Docker Images / Build Frontend (Next.js) (push) Successful in 1m12s
Build and Push Docker Images / Build Integrator (push) Successful in 57s
Build and Push Docker Images / Build Kestra Init (push) Successful in 32s
Build and Push Docker Images / Trigger Portainer Update (push) Successful in 1s
create_all() only creates missing tables; it won't modify tables that already exist from an older schema version. Add _apply_schema_alterations() which runs idempotent ADD COLUMN IF NOT EXISTS statements after every migration so supplementary tables (like ofsted_inspections) gain new columns without dropping their existing data. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -404,6 +404,35 @@ def migrate_data(df: pd.DataFrame, geocode: bool = False, geocode_cache: dict =
|
|||||||
print("\nMigration complete!")
|
print("\nMigration complete!")
|
||||||
|
|
||||||
|
|
||||||
|
def _apply_schema_alterations():
|
||||||
|
"""
|
||||||
|
Add new columns to existing tables using ALTER TABLE … ADD COLUMN IF NOT EXISTS.
|
||||||
|
Safe to run on every migration — no-ops if the column already exists.
|
||||||
|
Add entries here whenever models.py gains new columns on an existing table.
|
||||||
|
"""
|
||||||
|
alterations = [
|
||||||
|
# v4: Ofsted Report Card columns
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS framework VARCHAR(20)",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_safeguarding_met BOOLEAN",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_inclusion INTEGER",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_curriculum_teaching INTEGER",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_achievement INTEGER",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_attendance_behaviour INTEGER",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_personal_development INTEGER",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_leadership_governance INTEGER",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_early_years INTEGER",
|
||||||
|
"ALTER TABLE ofsted_inspections ADD COLUMN IF NOT EXISTS rc_sixth_form INTEGER",
|
||||||
|
]
|
||||||
|
from sqlalchemy import text as sa_text
|
||||||
|
with engine.connect() as conn:
|
||||||
|
for stmt in alterations:
|
||||||
|
try:
|
||||||
|
conn.execute(sa_text(stmt))
|
||||||
|
except Exception as e:
|
||||||
|
print(f" Warning: alteration skipped ({e})")
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
|
||||||
def run_full_migration(geocode: bool = False) -> bool:
|
def run_full_migration(geocode: bool = False) -> bool:
|
||||||
"""
|
"""
|
||||||
Run a complete migration: drop all tables and reimport from CSV.
|
Run a complete migration: drop all tables and reimport from CSV.
|
||||||
@@ -443,6 +472,13 @@ def run_full_migration(geocode: bool = False) -> bool:
|
|||||||
print("Creating all tables...")
|
print("Creating all tables...")
|
||||||
Base.metadata.create_all(bind=engine)
|
Base.metadata.create_all(bind=engine)
|
||||||
|
|
||||||
|
# ALTER existing supplementary tables to add any new columns.
|
||||||
|
# create_all() only creates missing tables; it won't add columns to tables
|
||||||
|
# that already exist from an older schema version. These statements are
|
||||||
|
# idempotent (IF NOT EXISTS) so they're safe to run on every migration.
|
||||||
|
print("Applying column additions to supplementary tables...")
|
||||||
|
_apply_schema_alterations()
|
||||||
|
|
||||||
print("\nLoading CSV data...")
|
print("\nLoading CSV data...")
|
||||||
df = load_csv_data(settings.data_dir)
|
df = load_csv_data(settings.data_dir)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user