better migration handling
This commit is contained in:
parent
58dd9fb439
commit
d729924101
@ -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.")
|
||||||
|
Loading…
Reference in New Issue
Block a user