Migrationen
Nummerierte SQL-Migrationen, die durch den Nibiru CLI getrieben werden.
Migrationen sind flache SQL-Dateien im Verzeichnis application/settings/config/database/, die in numerischer Reihenfolge ausgeführt werden. Die Befehlszeilenschnittstelle verfolgt, welche Dateien ausgeführt wurden, und überspringt sie bei nachfolgenden Aufrufen.
Dateinamenskonventionen
Abschnitt betitelt „Dateinamenskonventionen“NNN-<slug>.sqlNNN: Null aufgefüllte dreistellige Nummer für die Sortierreihenfolge.<slug>: Bindestrich-getrennte Beschreibung (add-account-email,create-acl-data).
Beispiel-Aufschlüsselung:
001-acl.sql002-account.sql003-api_registry.sql004-timeanddate.sql005-user.sql006-user_to_account.sql007-timeanddate_to_account.sql008-user_to_acl.sql009-account_to_api_registry.sql010-timeanddate_to_user.sql011-acl-data.sql012-add-unique-key-user.sql013-add-account-email.sqlMigrations ausführen
Abschnitt betitelt „Migrations ausführen“./nibiru -mi local # APPLICATION_ENV=developmentAPPLICATION_ENV=staging ./nibiru -mi stagingAPPLICATION_ENV=production ./nibiru -mi productionDer {env}-Argument und die APPLICATION_ENV sollten übereinstimmen. Migrationen zielen auf die in settings.<env>.ini unter [DATABASE] konfigurierte Datenbank ab.
Was der Runner macht
Abschnitt betitelt „Was der Runner macht“Für jede *.sql-Datei in numerischer Reihenfolge:
- Sucht nach seinem Dateinamen in der Tabelle
_migrations. - Wenn nicht vorhanden, öffnet eine Transaktion (wenn der Treiber DDL-Transaktionen unterstützt), führt die Datei aus und fügt einen Datensatz bei Erfolg ein.
- Wenn eine Anweisung fehlschlägt, wird rückgängig gemacht und mit einem Nicht-null-Ausgang beendet.
Die _migrations Tabelle wird beim ersten Start automatisch erstellt.
Idempotente SQL
Abschnitt betitelt „Idempotente SQL“Schreiben Sie immer Migrationen, die ohne Fehler erneut ausgeführt werden können, nach einem teilweisen Fehler:
CREATE TABLE IF NOT EXISTS api_registry ( api_registry_id INT(11) NOT NULL AUTO_INCREMENT, api_registry_name VARCHAR(255) NOT NULL, PRIMARY KEY (api_registry_id), UNIQUE KEY api_registry_name_uk (api_registry_name)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;Für PostgreSQL:
CREATE TABLE IF NOT EXISTS api_registry ( api_registry_id SERIAL PRIMARY KEY, api_registry_name TEXT NOT NULL UNIQUE);Für ALTER-Anweisungen bevorzugen Sie Klauseln mit IF NOT EXISTS auf unterstützten Engines:
ALTER TABLE "user" ADD COLUMN IF NOT EXISTS user_email VARCHAR(255);Falls Ihr Motor keine Unterstützung für IF NOT EXISTS bei der Änderung bietet, umschließen Sie die Anweisung in eine Guard-Abfrage, die nichts tut, wenn die Änderung bereits vorhanden ist.
Befehle zum Zurücksetzen
Abschnitt betitelt „Befehle zum Zurücksetzen“::: caution
Die Reset-Befehle leeren die Migrations-Audit-Tabelle – sie löschen Ihre Datenbanktabellen nicht. Nach einem Reset führt der nächste -mi jede Migration erneut aus. Stellen Sie sicher, dass Ihr SQL idempotent ist, bevor Sie zurücksetzen.
:::
./nibiru -mi-reset local # forget all applied migrations./nibiru -mi-reset-file 005-user.sql local # forget a single fileDas Einzeldateiformular ist nützlich, wenn Sie einen Fehler in einer zuvor angewandten Migration behoben haben und nur diese Datei erneut ausführen möchten.
Verzweigungsreinheit
Abschnitt betitelt „Verzweigungsreinheit“Zwei Ingenieure, die an parallelen Zweigen arbeiten, können beide 015-… hinzufügen und kollidieren. Konventionen, die helfen:
- Zahlen in Pull-Request-Titeln vorbehalten, bevor Sie die SQL schreiben.
- Verwenden Sie einen großen Abstand für Hotfixes (z.B. behalten Sie
099,199,299für Notfall-Picks vor). - Fügen Sie lieber additive Migrationen (neue Tabellen, neue Spalten) als zerstörende ones (Drops) hinzu. Diese führen sauberer zusammen.
Zusammenführen
Abschnitt betitelt „Zusammenführen“Für langfristige Projekte sollten alte Migrationen regelmäßig in eine einzelne Seed-Datei zusammengefasst werden, die das aktuelle Schema darstellt. Verschieben Sie die Originalien nach archive/, sodass der Überwachungsverlauf weiterhin besteht, und erstellen Sie eine neue 000-baseline-2026.sql, die alles auf einmal erstellt. Aktualisieren Sie den Migrationsrunner mit einer manuellen INSERT INTO _migrations, um alte Dateien als angewendet zu markieren.
Schema-first Modelle
Abschnitt betitelt „Schema-first Modelle“Wenn [GENERATOR] database = true ist, werden die Modelle nach jeder Migration aus dem Live-Schema neu generiert. Also ist ein typischer Deploy-Workflow:
./nibiru -mi production# Generator regenerates models on the next request../nibiru -cache-clearFür zero-downtime Deploys: Deaktivieren Sie den Generator (database = false) und übertragen Sie die neu generierten Modelle zusammen mit den Migrationen, auf denen sie abhängen.