better migration handling

This commit is contained in:
Lera Elvoé 2025-07-02 18:51:45 +03:00
parent 58dd9fb439
commit d729924101
Signed by: yagich
SSH Key Fingerprint: SHA256:6xjGb6uA7lAVcULa7byPEN//rQ0wPoG+UzYVMfZnbvc

View File

@ -1,9 +1,9 @@
from .db import db from .db import db
# format: {integer: str|list<str>} # format: [str|tuple(str, any...)|callable]
MIGRATIONS = { MIGRATIONS = [
} ]
def run_migrations(): def run_migrations():
db.execute(""" db.execute("""
@ -16,18 +16,21 @@ def run_migrations():
return return
print("Running migrations...") print("Running migrations...")
ran = 0 ran = 0
completed = [row["id"] for row in db.query("SELECT id FROM _migrations")] completed = {int(row["id"]) for row in db.query("SELECT id FROM _migrations")}
for migration_id in sorted(MIGRATIONS.keys()): to_run = {idx: migration_obj for idx, migration_obj in enumerate(MIGRATIONS) if idx not in completed}
if migration_id not in completed: if not to_run:
print(f"Running migration #{migration_id}") print('No migrations need to run.')
return
with db.transaction():
for migration_id, migration_obj in to_run.items():
if isinstance(migration_obj, str):
db.execute(migration_obj)
elif isinstance(migration_obj, tuple):
db.execute(migration_obj[0], *migration_obj[1:])
elif callable(migration_obj):
migration_obj()
db.execute('INSERT INTO _migrations (id) VALUES (?)', migration_id)
ran += 1 ran += 1
statements = MIGRATIONS[migration_id]
# support both strings and lists
if isinstance(statements, str):
statements = [statements]
for sql in statements:
db.execute(sql)
db.execute("INSERT INTO _migrations (id) VALUES (?)", migration_id)
print(f"Ran {ran} migrations.") print(f"Ran {ran} migrations.")