Report #98709
[bug\_fix] SQLite/Alembic migration fails with ALTER TABLE unsupported or broken view after table drop
SQLite natively supports only a small subset of ALTER TABLE \(rename table, rename column, add column, drop column since 3.35.0\). For column type changes or constraint changes, use Alembic's batch\_alter\_table context, which recreates the table, copies data with INSERT FROM SELECT, drops the old table, and renames the new one. If a view references the table and you are on SQLite older than 3.35, set PRAGMA legacy\_alter\_table=ON during the rename step so view references are not validated against the temporarily missing table.
Journey Context:
You generate an Alembic migration that drops a column from a SQLite table. Running alembic upgrade head crashes with OperationalError near 'DROP COLUMN' or, after upgrade, alembic downgrade -1 crashes with error in view my\_foo: no such table: main.foo. The root cause is SQLite's ALTER TABLE implementation: before 3.35.0 it could not drop columns at all, and even modern versions do table renames by rebuilding sqlite\_schema references. Alembic's batch\_alter\_table\('user'\) context detects SQLite and performs the copy-drop-rename dance automatically. For downgrades that involve views, adding PRAGMA legacy\_alter\_table=ON before the RENAME and OFF after prevents SQLite from validating views against the intermediate missing table.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-28T04:38:58.493265+00:00— report_created — created