Leitfaden

Datenbankmigrationen

Halte Änderungen am Datenbankschema übersichtlich, in der richtigen Reihenfolge und mit dem integrierten Migrationssystem nachvollziehbar.

Migration in der Anwendung erstellen

Migrationen gehören zur Anwendung und liegen üblicherweise unter App\Database\Migrations. Jede Klasse hat einen stabilen Bezeichner im Format YYYYMMDDHHMMSS_description und führt Schemaänderungen in up(Schema $schema) aus. Sobald eine Migration angewendet wurde, darf ihr Bezeichner nicht mehr geändert werden.

example.php
<?php

declare(strict_types=1);

namespace App\Database\Migrations;

use Lemonade\Framework\Database\Migration\MigrationInterface;
use Lemonade\Framework\Database\Schema\Schema;

final class CreateUsersTable implements MigrationInterface
{
    public static function identifier(): string
    {
        return '20260908090000_create_users';
    }

    public function up(Schema $schema): void
    {
        $schema->create('users', static function ($table): void {
            $table->id();
            $table->string('email', 255);
            $table->string('password', 255);
        });
    }
}

Migrationsklassen explizit registrieren

Registriere jede Migration als class-string im AppServiceProvider. MigrationRegistry prüft und sortiert den Bezeichner, ohne die Migration zu instanziieren. Bereits angewendete Migrationen und Statusabfragen müssen daher weder Migrationsinstanzen erzeugen noch deren Konstruktorabhängigkeiten auflösen.

example.php
<?php

declare(strict_types=1);

namespace App\Providers;

use App\Database\Migrations\CreateUsersTable;
use Lemonade\Framework\Container\ContainerInterface;
use Lemonade\Framework\Core\ServiceProviderInterface;
use Lemonade\Framework\Database\Migration\MigrationRegistry;

final class AppServiceProvider implements ServiceProviderInterface
{
    public function register(ContainerInterface $container): void
    {
        $registry = $container->get(MigrationRegistry::class);

        $registry->register(CreateUsersTable::class);
    }
}

Migrationen ausführen und Status prüfen

Führe ausstehende Migrationen über die CLI aus. database:migrate:status zeigt angewendete und ausstehende Migrationen sowie Bezeichner, die in der Migrationshistorie gespeichert sind, aber nicht mehr in der Anwendung registriert werden.

example.php
vendor/bin/lemonade database:migrate
vendor/bin/lemonade database:migrate:status

Angewendete Migrationshistorie stabil halten

Migrationen sind einseitig. Lemonade bietet keinen Rollback, kein down(), keine Batches, keine Checksummen, keine automatische Dateisystem-Erkennung und keine automatischen DDL-Transaktionen. Welche Schemaoperationen verfügbar sind, hängt vom konfigurierten Datenbanktreiber und Dialekt ab.