Merge db-migrations: Add Flask-Migrate support and clean up old migration system
This commit is contained in:
96
clean_migration_state.py
Normal file
96
clean_migration_state.py
Normal file
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python
|
||||
"""Clean migration state and handle orphaned tables"""
|
||||
|
||||
from app import app, db
|
||||
from sqlalchemy import text
|
||||
|
||||
def get_all_tables():
|
||||
"""Get all tables in the database"""
|
||||
with app.app_context():
|
||||
result = db.session.execute(text(
|
||||
"SELECT table_name FROM information_schema.tables "
|
||||
"WHERE table_schema = 'public' AND table_type = 'BASE TABLE'"
|
||||
))
|
||||
return [row[0] for row in result]
|
||||
|
||||
def check_migration_state():
|
||||
"""Check current migration state"""
|
||||
with app.app_context():
|
||||
try:
|
||||
result = db.session.execute(text("SELECT version_num FROM alembic_version"))
|
||||
row = result.fetchone()
|
||||
if row:
|
||||
print(f"Current migration version: {row[0]}")
|
||||
return row[0]
|
||||
except:
|
||||
print("No alembic_version table found")
|
||||
return None
|
||||
|
||||
def clean_migration_only():
|
||||
"""Clean only the migration state, keep all other tables"""
|
||||
with app.app_context():
|
||||
try:
|
||||
print("Cleaning migration state only...")
|
||||
db.session.execute(text("DELETE FROM alembic_version"))
|
||||
db.session.commit()
|
||||
print("Migration state cleaned successfully!")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
db.session.rollback()
|
||||
return False
|
||||
|
||||
def list_orphaned_tables():
|
||||
"""List tables that exist in DB but not in models"""
|
||||
with app.app_context():
|
||||
all_tables = get_all_tables()
|
||||
|
||||
# Get tables from current models
|
||||
model_tables = set()
|
||||
for table in db.metadata.tables.values():
|
||||
model_tables.add(table.name)
|
||||
|
||||
# Find orphaned tables
|
||||
orphaned = []
|
||||
for table in all_tables:
|
||||
if table not in model_tables and table != 'alembic_version':
|
||||
orphaned.append(table)
|
||||
|
||||
return orphaned
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("=== Migration State Check ===")
|
||||
|
||||
# Check current state
|
||||
version = check_migration_state()
|
||||
|
||||
# List all tables
|
||||
print("\n=== Database Tables ===")
|
||||
tables = get_all_tables()
|
||||
for table in sorted(tables):
|
||||
print(f" - {table}")
|
||||
|
||||
# Check for orphaned tables
|
||||
orphaned = list_orphaned_tables()
|
||||
if orphaned:
|
||||
print("\n=== Orphaned Tables (not in current models) ===")
|
||||
for table in sorted(orphaned):
|
||||
print(f" - {table}")
|
||||
print("\nThese tables exist in the database but are not defined in your current models.")
|
||||
print("They might be from old features or previous schema versions.")
|
||||
|
||||
if version:
|
||||
print(f"\n=== Action Required ===")
|
||||
print(f"The database has migration '{version}' but no migration files exist.")
|
||||
print("\nOptions:")
|
||||
print("1. Clean migration state only (keeps all tables)")
|
||||
print("2. Cancel and handle manually")
|
||||
|
||||
choice = input("\nEnter your choice (1 or 2): ")
|
||||
|
||||
if choice == '1':
|
||||
if clean_migration_only():
|
||||
print("\n✓ Migration state cleaned!")
|
||||
print("You can now run: python create_migration.py")
|
||||
else:
|
||||
print("\nCancelled. No changes made.")
|
||||
Reference in New Issue
Block a user