diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ad98212 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +.PHONY: check-docker migrate migration-rollback + +check-docker: + @command -v docker >/dev/null 2>&1 || { echo "Docker nie jest zainstalowany lub nie ma go w PATH." >&2; exit 1; } + @docker compose version >/dev/null 2>&1 || { echo "Docker Compose nie jest dostępny przez polecenie 'docker compose'." >&2; exit 1; } + +MIGRATION_RUNNER = zyrarbot.storage.adapters.postgres.migration_runner + +migrate: check-docker + docker compose run --build --rm discord-bot python -m $(MIGRATION_RUNNER) migrate + +# Użyj np. `make migration-rollback TO=1`; domyślnie cofa wszystkie migracje. +TO ?= 0 +migration-rollback: check-docker + docker compose run --build --rm discord-bot python -m $(MIGRATION_RUNNER) rollback --to $(TO) diff --git a/README.md b/README.md index c8720fe..0c00d2d 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,8 @@ katalogach `uploads//`. ### Migracje bazy Przy uruchomieniu bot automatycznie stosuje oczekujące migracje PostgreSQL. +Można je też uruchomić jawnie przez `make migrate`. Makefile korzysta wyłącznie +z Dockera i sprawdza, czy dostępne są Docker oraz `docker compose`. Zastosowane wersje i ich nazwy są zapisywane w tabeli `schema_migrations`. Każda migracja jest osobną klasą z metodami `apply` i `rollback`, w osobnym pliku w `zyrarbot/storage/adapters/postgres/migrations/`. Pliki należy nazywać @@ -60,12 +62,12 @@ dodać także do krotki `MIGRATIONS` w `migrations/__init__.py`. Obecna migracja Rollback wszystkich wersji wykonaj poleceniem: ```bash -docker compose exec discord-bot python -m zyrarbot.storage.adapters.postgres.migration_runner rollback +make migration-rollback ``` -Aby cofnąć wersje nowsze niż wskazana, dodaj `--to N`, na przykład `--to 1` -pozostawi migrację w wersji 1. Przed rollbackiem zatrzymaj bota poleceniem -`docker compose stop discord-bot`. Rollback wykonuje migracje w odwrotnej kolejności, +Aby cofnąć wersje nowsze niż wskazana, ustaw `TO`, na przykład +`make migration-rollback TO=1` pozostawi migrację w wersji 1. Przed rollbackiem +zatrzymaj bota poleceniem `docker compose stop discord-bot`. Rollback wykonuje migracje w odwrotnej kolejności, usuwa ich wpisy z `schema_migrations` i może trwale skasować dane z cofanych tabel. Po rollbacku uruchomienie bota ponownie zastosuje brakujące migracje. diff --git a/zyrarbot/storage/adapters/postgres/migration_runner.py b/zyrarbot/storage/adapters/postgres/migration_runner.py index 24b5bdd..6856161 100644 --- a/zyrarbot/storage/adapters/postgres/migration_runner.py +++ b/zyrarbot/storage/adapters/postgres/migration_runner.py @@ -60,7 +60,7 @@ class MigrationRunner: def main() -> None: parser = argparse.ArgumentParser(description="Manage PostgreSQL schema migrations") - parser.add_argument("action", choices=("rollback",)) + parser.add_argument("action", choices=("migrate", "rollback")) parser.add_argument("--to", type=int, default=0, dest="target_version") args = parser.parse_args() @@ -71,7 +71,11 @@ def main() -> None: user=os.environ.get("POSTGRES_USER", "zyrarbot"), password=os.environ.get("POSTGRES_PASSWORD", "zyrarbot"), ) as connection: - MigrationRunner(MIGRATIONS).rollback_to(connection, args.target_version) + runner = MigrationRunner(MIGRATIONS) + if args.action == "migrate": + runner.apply_pending(connection) + else: + runner.rollback_to(connection, args.target_version) if __name__ == "__main__":