diff --git a/backend/database/Migrations.py b/backend/database/Migrations.py new file mode 100644 index 0000000..d6c0c5b --- /dev/null +++ b/backend/database/Migrations.py @@ -0,0 +1,31 @@ +from flask_sqlalchemy import SQLAlchemy +from database.Models import * +from sqlalchemy.orm import session +from sqlalchemy import text +import util + + +def migrate(db: session): + current_db_version: KeyValue = db.query(KeyValue).filter_by( + key="version").first() + print("Current database version:", current_db_version.value) + + migrations = [ + # Add lists for migrations + # E.g ALTER TABLE drink ADD column price6 float DEFAULT 50 + #["ALTER TABLE drink ADD column price6 float DEFAULT 50"] + ] + + if util.CURRENT_VERSION != len(migrations): + print("Error: No migration available") + exit() + + for migration in migrations[int(current_db_version.value):]: + print("Migrating from", current_db_version.value, + "to", int(current_db_version.value)+1) + for statement in migration: + db.execute(text(statement)) + current_db_version.value = int(current_db_version.value)+1 + db.commit() + + print("Migrations complete") diff --git a/backend/database/Queries.py b/backend/database/Queries.py index 04af9ad..1086380 100644 --- a/backend/database/Queries.py +++ b/backend/database/Queries.py @@ -16,7 +16,7 @@ import os from sqlalchemy import extract from difflib import SequenceMatcher -from sqlalchemy import inspect, text +import database.Migrations class Queries: @@ -27,6 +27,7 @@ def __init__(self, db): self.db.create_all() if self.session.query(Member).first() is None: self.create_dummy_data() + database.Migrations.migrate(self.session) def get_users(self): members = self.session.query(Member).all() @@ -587,12 +588,10 @@ def remove_message(self, message_id): reminder: Reminder = self.session.query( Reminder).filter_by(id=message_id).first() - self.session.delete(reminder) self.session.commit() - def get_username_alias(self, member_id): member: Member = self.session.query( Member).filter_by(id=member_id).first() @@ -829,7 +828,8 @@ def create_dummy_data(self) -> None: util.moderator_password) self.session.add( Member(name=util.moderator_username, password=hashedPassword, salt=salt)) - + self.session.add( + KeyValue(key="version", value=util.CURRENT_VERSION)) self.session.commit() if util.token is not None and util.old_domain is not None: diff --git a/backend/util.py b/backend/util.py index b124733..5a522b8 100644 --- a/backend/util.py +++ b/backend/util.py @@ -70,6 +70,8 @@ OIDC_USER_NEEDS_VERIFICATION = os.environ.get( "OIDC_USER_NEEDS_VERIFICATION") == "true" if os.environ.get("OIDC_USER_NEEDS_VERIFICATION") else True +CURRENT_VERSION = 0 + tempfile_path = "tempfiles" backup_file_name = "backup.json"