Dbmate ist ein Datenbankmigrationstool, das Ihr Datenbankschema über mehrere Entwickler und Ihre Produktionsserver hinweg synchron hält.
Es handelt sich um ein eigenständiges Befehlszeilentool, das mit Go, Node.js, Python, Ruby, PHP, Rust, C++ oder jeder anderen Sprache oder jedem anderen Framework verwendet werden kann, das Sie zum Schreiben datenbankgestützter Anwendungen verwenden. Dies ist besonders hilfreich, wenn Sie mehrere Dienste in verschiedenen Sprachen schreiben und mit konsistenten Entwicklungstools ein gewisses Maß an Vernunft wahren möchten.
Einen Vergleich zwischen dbmate und anderen gängigen Datenbankschema-Migrationstools finden Sie unter Alternativen.
schema.sql
Datei, um Schemaänderungen in Git einfach zu unterscheidenDATABASE_URL
) definiert oder in der Befehlszeile angegeben.env
DateiNPM
Installation mit NPM:
npm install --save-dev dbmate
npx dbmate --help
macOS
Installation mit Homebrew:
brew install dbmate
dbmate --help
Linux
Installieren Sie die Binärdatei direkt:
sudo curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
sudo chmod +x /usr/local/bin/dbmate
/usr/local/bin/dbmate --help
Windows
Mit Scoop installieren
scoop install dbmate
dbmate -- help
Docker
Docker-Images werden in GitHub Container Registry ( ghcr.io/amacneil/dbmate
) veröffentlicht.
Denken Sie daran, --network=host
festzulegen oder lesen Sie diesen Kommentar für weitere Tipps zur Verwendung von dbmate mit Docker-Netzwerken):
docker run --rm -it --network=host ghcr.io/amacneil/dbmate --help
Wenn Sie Migrationen erstellen oder anwenden möchten, müssen Sie die Bind-Mount-Funktion von Docker verwenden, um Ihr lokales Arbeitsverzeichnis ( pwd
) im dbmate-Container verfügbar zu machen:
docker run --rm -it --network=host -v " $( pwd ) /db:/db " ghcr.io/amacneil/dbmate new create_users_table
dbmate --help # print usage help
dbmate new # generate a new migration file
dbmate up # create the database (if it does not already exist) and run any pending migrations
dbmate create # create the database
dbmate drop # drop the database
dbmate migrate # run any pending migrations
dbmate rollback # roll back the most recent migration
dbmate down # alias for rollback
dbmate status # show the status of all migrations (supports --exit-code and --quiet)
dbmate dump # write the database schema.sql file
dbmate load # load schema.sql file to the database
dbmate wait # wait for the database server to become available
Die folgenden Optionen sind bei allen Befehlen verfügbar. Sie müssen Befehlszeilenargumente in der Reihenfolge dbmate [global options] command [command options]
verwenden. Die meisten Optionen können auch über Umgebungsvariablen konfiguriert werden (und aus Ihrer .env
Datei geladen werden, was hilfreich ist, um die Konfiguration zwischen Teammitgliedern zu teilen).
--url, -u "protocol://host:port/dbname"
– Geben Sie die Datenbank-URL direkt an. (Umgebung: DATABASE_URL
)--env, -e "DATABASE_URL"
– Geben Sie eine Umgebungsvariable an, aus der die Datenbankverbindungs-URL gelesen werden soll.--env-file ".env"
– Geben Sie eine oder mehrere alternative Umgebungsvariablendateien an, die geladen werden sollen.--migrations-dir, -d "./db/migrations"
– Speicherort für die Migrationsdateien. (Umgebung: DBMATE_MIGRATIONS_DIR
)--migrations-table "schema_migrations"
– Datenbanktabelle zum Aufzeichnen von Migrationen. (Umgebung: DBMATE_MIGRATIONS_TABLE
)--schema-file, -s "./db/schema.sql"
– ein Pfad zum Speichern der Datei schema.sql. (Umgebung: DBMATE_SCHEMA_FILE
)--no-dump-schema
– schema.sql-Datei bei Migration/Rollback nicht automatisch aktualisieren (Umgebung: DBMATE_NO_DUMP_SCHEMA
)--strict
– schlägt fehl, wenn Migrationen in der falschen Reihenfolge angewendet würden (Umgebung: DBMATE_STRICT
)--wait
– Warten Sie, bis die Datenbank verfügbar ist, bevor Sie den folgenden Befehl ausführen (Umgebung: DBMATE_WAIT
).--wait-timeout 60s
– Zeitüberschreitung für das Flag --wait (Umgebung: DBMATE_WAIT_TIMEOUT
) Dbmate findet Ihre Datenbank standardmäßig mithilfe der Umgebungsvariablen DATABASE_URL
. Wenn Sie eine Zwölf-Faktor-App schreiben, sollten Sie alle Verbindungszeichenfolgen in Umgebungsvariablen speichern.
Um dies in der Entwicklung zu vereinfachen, sucht dbmate nach einer .env
Datei im aktuellen Verzeichnis und behandelt alle dort aufgeführten Variablen so, als ob sie in der aktuellen Umgebung angegeben wären (vorhandene Umgebungsvariablen haben jedoch Vorrang).
Wenn Sie noch keine .env
Datei haben, erstellen Sie eine und fügen Sie die URL Ihrer Datenbankverbindung hinzu:
$ cat .env
DATABASE_URL= " postgres://[email protected]:5432/myapp_development?sslmode=disable "
DATABASE_URL
sollte im folgenden Format angegeben werden:
protocol://username:password@host:port/database_name?options
protocol
muss eines von mysql
, postgres
, postgresql
, sqlite
, sqlite3
oder clickhouse
seinusername
und password
müssen URL-codiert sein (bei Verwendung von Sonderzeichen erhalten Sie eine Fehlermeldung)host
kann entweder ein Hostname oder eine IP-Adresse seinoptions
sind treiberspezifisch (siehe die zugrunde liegenden Go SQL-Treiber, wenn Sie diese verwenden möchten) Dbmate kann die Verbindungs-URL auch aus einer anderen Umgebungsvariablen laden. Bevor Sie beispielsweise Ihre Testsuite ausführen, möchten Sie möglicherweise die Testdatenbank löschen und neu erstellen. Eine einfache Möglichkeit, dies zu tun, besteht darin, die URL Ihrer Testdatenbankverbindung in der Umgebungsvariablen TEST_DATABASE_URL
zu speichern:
$ cat .env
DATABASE_URL= " postgres://[email protected]:5432/myapp_dev?sslmode=disable "
TEST_DATABASE_URL= " postgres://[email protected]:5432/myapp_test?sslmode=disable "
Anschließend können Sie diese Umgebungsvariable in Ihrem Testskript (Makefile oder ähnliches) angeben:
$ dbmate -e TEST_DATABASE_URL drop
Dropping: myapp_test
$ dbmate -e TEST_DATABASE_URL --no-dump-schema up
Creating: myapp_test
Applying: 20151127184807_create_users_table.sql
Applied: 20151127184807_create_users_table.sql in 123µs
Alternativ können Sie die URL auch direkt in der Befehlszeile angeben:
$ dbmate -u " postgres://[email protected]:5432/myapp_test?sslmode=disable " up
Der einzige Vorteil der Verwendung von dbmate -e TEST_DATABASE_URL
gegenüber dbmate -u $TEST_DATABASE_URL
besteht darin, dass ersteres das automatische Laden von .env
Dateien von dbmate nutzt.
Wenn Sie eine Verbindung zu Postgres herstellen, müssen Sie möglicherweise die Option sslmode=disable
zu Ihrer Verbindungszeichenfolge hinzufügen, da dbmate standardmäßig eine TLS-Verbindung erfordert (einige andere Frameworks/Sprachen erlauben standardmäßig unverschlüsselte Verbindungen).
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?sslmode=disable "
Für die Verbindung über einen Unix-Socket kann ein socket
oder host
Parameter angegeben werden (Hinweis: Geben Sie nur das Verzeichnis an):
DATABASE_URL= " postgres://username:password@/database_name?socket=/var/run/postgresql "
Ein search_path
-Parameter kann verwendet werden, um das aktuelle Schema beim Anwenden von Migrationen sowie für die Tabelle schema_migrations
von dbmate anzugeben. Wenn das Schema nicht vorhanden ist, wird es automatisch erstellt. Wenn mehrere durch Kommas getrennte Schemata übergeben werden, wird das erste für die Tabelle schema_migrations
verwendet.
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?search_path=myschema "
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?search_path=myschema,public "
DATABASE_URL= " mysql://username:[email protected]:3306/database_name "
Für die Verbindung über einen Unix-Socket kann ein socket
Parameter angegeben werden:
DATABASE_URL= " mysql://username:password@/database_name?socket=/var/run/mysqld/mysqld.sock "
SQLite-Datenbanken werden im Dateisystem gespeichert, sodass Sie keinen Host angeben müssen. Standardmäßig sind Dateien relativ zum aktuellen Verzeichnis. Mit dem folgenden Befehl wird beispielsweise eine Datenbank unter ./db/database.sqlite3
erstellt:
DATABASE_URL= " sqlite:db/database.sqlite3 "
Um einen absoluten Pfad anzugeben, fügen Sie dem Pfad einen Schrägstrich hinzu. Folgendes erstellt eine Datenbank unter /tmp/database.sqlite3
:
DATABASE_URL= " sqlite:/tmp/database.sqlite3 "
DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name "
Um mit dem ClickHouse-Cluster zu arbeiten, können vier Verbindungsabfrageparameter bereitgestellt werden:
on_cluster
– Angabe zur Verwendung von Cluster-Anweisungen und replizierter Migrationstabelle. (Standard: false
) Wenn dieser Parameter nicht angegeben wird, werden andere Cluster-bezogene Abfrageparameter ignoriert. DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster "
DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster=true "
cluster_macro
(Optional) – Makrowert, der für ON CLUSTER-Anweisungen und für den Zookeeper-Pfad der replizierten Migrationstabellen-Engine verwendet werden soll. (Standard: {cluster}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&cluster_macro={my_cluster} "
replica_macro
(Optional) – Makrowert, der für den Replikatnamen in der replizierten Migrationstabellen-Engine verwendet werden soll. (Standard: {replica}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&replica_macro={my_replica} "
zoo_path
(Optional) – Der Pfad zur Tabellenmigration in ClickHouse/Zoo Keeper. (Standard: /clickhouse/tables/<cluster_macro>/{table}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&zoo_path=/zk/path/tables "
Weitere unterstützte Verbindungsoptionen anzeigen.
Befolgen Sie das folgende Format für DATABASE_URL
, wenn Sie eine Verbindung zu tatsächlichem BigQuery in GCP herstellen:
bigquery://projectid/location/dataset
projectid
(obligatorisch) – Projekt-ID
dataset
(obligatorisch) – Datensatzname innerhalb des Projekts
location
(optional) – Ort, an dem der Datensatz erstellt wird
HINWEIS: Befolgen Sie dieses Dokument, um zu erfahren, wie Sie die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS
für eine ordnungsgemäße Authentifizierung festlegen
Befolgen Sie das folgende Format, wenn Sie versuchen, eine Verbindung zu einem benutzerdefinierten Endpunkt herzustellen, z. B. dem BigQuery-Emulator
bigquery://host:port/projectid/location/dataset?disable_auth=true
disable_auth
(optional) – Übergeben Sie true
, um die Authentifizierung zu überspringen. Verwenden Sie es nur zum Testen und Herstellen einer Verbindung zum Emulator.
Die Spanner-Unterstützung ist derzeit auf Datenbanken beschränkt, die den PostgreSQL-Dialekt verwenden, der bei der Datenbankerstellung ausgewählt werden muss. Informationen zur zukünftigen Unterstützung von Spanner mit GoogleSQL finden Sie in dieser Diskussion.
Spanner mit der Postgres-Schnittstelle erfordert, dass der PGAdapter ausgeführt wird. Verwenden Sie das folgende Format für DATABASE_URL
, wobei Host und Port auf den Ort eingestellt sind, an dem der PGAdapter ausgeführt wird:
DATABASE_URL= " spanner-postgres://127.0.0.1:5432/database_name?sslmode=disable "
Beachten Sie, dass die Angabe eines Benutzernamens und Passworts nicht erforderlich ist, da die Authentifizierung vom PGAdapter übernommen wird (sie werden vom PGAdapter ignoriert, wenn sie angegeben werden).
Andere Optionen des Postgres-Treibers werden unterstützt.
Spanner erlaubt außerdem nicht, dass DDL innerhalb expliziter Transaktionen ausgeführt wird. Sie müssen daher bei Migrationen, die DDL umfassen transaction:false
angeben:
-- migrate:up transaction:false
CREATE TABLE ...
-- migrate:down transaction:false
DROP TABLE ...
Schema-Dumps werden derzeit nicht unterstützt, da pg_dump
Funktionen verwendet, die nicht von Spanner bereitgestellt werden.
Um eine neue Migration zu erstellen, führen Sie dbmate new create_users_table
aus. Sie können der Migration einen beliebigen Namen geben. Dadurch wird eine Datei db/migrations/20151127184807_create_users_table.sql
im aktuellen Verzeichnis erstellt:
-- migrate:up
-- migrate:down
Um eine Migration zu schreiben, fügen Sie einfach Ihre SQL zum Abschnitt migrate:up
hinzu:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
email varchar ( 255 ) not null
);
-- migrate:down
Hinweis: Migrationsdateien werden im Format
[version]_[description].sql
benannt. Nur die Version (definiert als alle führenden numerischen Zeichen im Dateinamen) wird in der Datenbank aufgezeichnet, sodass Sie eine Migrationsdatei sicher umbenennen können, ohne dass dies Auswirkungen auf ihren aktuellen Anwendungsstatus hat.
Führen Sie dbmate up
um alle ausstehenden Migrationen auszuführen.
$ dbmate up
Creating: myapp_development
Applying: 20151127184807_create_users_table.sql
Applied: 20151127184807_create_users_table.sql in 123µs
Writing: ./db/schema.sql
Hinweis:
dbmate up
erstellt die Datenbank, wenn sie noch nicht vorhanden ist (vorausgesetzt, der aktuelle Benutzer hat die Berechtigung zum Erstellen von Datenbanken). Wenn Sie Migrationen ausführen möchten, ohne die Datenbank zu erstellen, führen Siedbmate migrate
aus.
Ausstehende Migrationen werden immer in numerischer Reihenfolge angewendet. Allerdings verhindert dbmate nicht, dass Migrationen nicht in der richtigen Reihenfolge angewendet werden, wenn sie unabhängig voneinander festgeschrieben werden (z. B. wenn ein Entwickler schon lange an einem Zweig arbeitet und eine Migration festschreibt, die eine niedrigere Versionsnummer als andere bereits hat). angewendete Migrationen, dbmate wendet einfach die ausstehende Migration an). Eine ausführlichere Erklärung finden Sie in Nr. 159.
Standardmäßig weiß dbmate nicht, wie eine Migration rückgängig gemacht werden kann. In der Entwicklung ist es oft nützlich, die Datenbank auf einen früheren Zustand zurücksetzen zu können. Um dies zu erreichen, implementieren Sie den Abschnitt migrate:down
:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
email varchar ( 255 ) not null
);
-- migrate:down
drop table users;
Führen Sie dbmate rollback
aus, um die letzte Migration rückgängig zu machen:
$ dbmate rollback
Rolling back: 20151127184807_create_users_table.sql
Rolled back: 20151127184807_create_users_table.sql in 123µs
Writing: ./db/schema.sql
dbmate unterstützt Optionen, die in Form von key:value
-Paaren an einen Migrationsblock übergeben werden. Liste der unterstützten Optionen:
transaction
Transaktion
transaction
ist nützlich, wenn Sie SQL nicht innerhalb einer Transaktion ausführen möchten:
-- migrate:up transaction:false
ALTER TYPE colors ADD VALUE ' orange ' AFTER ' red ' ;
transaction
wird standardmäßig auf true
gesetzt, wenn Ihre Datenbank dies unterstützt.
Wenn Sie für Ihr Projekt eine Docker-Entwicklungsumgebung verwenden, kann es zu Problemen kommen, wenn die Datenbank beim Ausführen von Migrationen oder Unit-Tests nicht sofort bereit ist. Dies kann daran liegen, dass der Datenbankserver gerade erst gestartet ist.
Im Allgemeinen sollte Ihre Anwendung widerstandsfähig sein, wenn beim Start keine funktionierende Datenbankverbindung besteht. Für die Durchführung von Migrationen oder Komponententests ist dies jedoch nicht praktikabel. Der Befehl wait
vermeidet diese Situation, indem er es Ihnen ermöglicht, ein Skript oder eine andere Anwendung anzuhalten, bis die Datenbank verfügbar ist. Dbmate versucht jede Sekunde, maximal 60 Sekunden lang, eine Verbindung zum Datenbankserver herzustellen.
Wenn die Datenbank verfügbar ist, gibt wait
keine Ausgabe zurück:
$ dbmate wait
Wenn die Datenbank nicht verfügbar ist, wird wait
blockiert, bis die Datenbank verfügbar wird:
$ dbmate wait
Waiting for database....
Sie können das Flag --wait
auch mit anderen Befehlen verwenden, wenn manchmal Fehler auftreten, die darauf zurückzuführen sind, dass die Datenbank noch nicht bereit ist:
$ dbmate --wait up
Waiting for database....
Creating: myapp_development
Sie können das Timeout mit --wait-timeout
anpassen (Standard 60 Sekunden). Wenn die Datenbank immer noch nicht verfügbar ist, gibt der Befehl einen Fehler zurück:
$ dbmate --wait-timeout=5s wait
Waiting for database.....
Error: unable to connect to database: dial tcp 127.0.0.1:5432: connect: connection refused
Bitte beachten Sie, dass der wait
nicht überprüft, ob Ihre angegebene Datenbank vorhanden ist, sondern nur, ob der Server verfügbar und bereit ist (so dass eine Erfolgsmeldung zurückgegeben wird, wenn der Datenbankserver verfügbar ist, Ihre Datenbank jedoch noch nicht erstellt wurde).
Wenn Sie die Befehle up
, migrate
oder rollback
ausführen, erstellt dbmate automatisch eine Datei ./db/schema.sql
, die eine vollständige Darstellung Ihres Datenbankschemas enthält. Da Dbmate diese Datei für Sie auf dem neuesten Stand hält, sollten Sie sie nicht manuell bearbeiten.
Es wird empfohlen, diese Datei in die Quellcodeverwaltung einzuchecken, damit Sie Änderungen am Schema in Commits oder Pull-Requests problemlos überprüfen können. Sie können diese Datei auch verwenden, wenn Sie schnell ein Datenbankschema laden möchten, ohne jede Migration nacheinander auszuführen (z. B. in Ihrer Testumgebung). Wenn Sie diese Datei jedoch nicht speichern möchten, können Sie sie zu Ihrem .gitignore
hinzufügen oder die Befehlszeilenoption --no-dump-schema
übergeben.
Um die Datei schema.sql
zu sichern, ohne weitere Aktionen auszuführen, führen Sie dbmate dump
aus. Im Gegensatz zu anderen dbmate-Aktionen ist dieser Befehl darauf angewiesen, dass die entsprechenden Befehle pg_dump
, mysqldump
oder sqlite3
in Ihrem PATH verfügbar sind. Wenn diese Tools nicht verfügbar sind, überspringt dbmate den Schema-Dump-Schritt während up
, migrate
oder rollback
Aktionen stillschweigend. Sie können das Problem diagnostizieren, indem Sie dbmate dump
ausführen und sich die Ausgabe ansehen:
$ dbmate dump
exec: " pg_dump " : executable file not found in $PATH
Auf Ubuntu- oder Debian-Systemen können Sie dies beheben, indem Sie postgresql-client
, mysql-client
bzw. sqlite3
installieren. Stellen Sie sicher, dass die von Ihnen installierte Paketversion größer oder gleich der auf Ihrem Datenbankserver ausgeführten Version ist.
Hinweis: Die Datei
schema.sql
enthält ein vollständiges Schema für Ihre Datenbank, auch wenn einige Tabellen oder Spalten außerhalb von dbmate-Migrationen erstellt wurden.
Dbmate ist für die Verwendung als CLI mit jeder Sprache oder jedem Framework konzipiert, kann aber auch als Bibliothek in einer Go-Anwendung verwendet werden.
Hier ist ein einfaches Beispiel. Denken Sie daran, den benötigten Treiber zu importieren!
package main
import (
"net/url"
"github.com/amacneil/dbmate/v2/pkg/dbmate"
_ "github.com/amacneil/dbmate/v2/pkg/driver/sqlite"
)
func main () {
u , _ := url . Parse ( "sqlite:foo.sqlite3" )
db := dbmate . New ( u )
err := db . CreateAndMigrate ()
if err != nil {
panic ( err )
}
}
Weitere Optionen finden Sie in der Referenzdokumentation.
Migrationen können mithilfe der Einbettungsfunktion von Go in Ihre Anwendungsbinärdatei eingebettet werden.
Verwenden Sie db.FS
, um das Dateisystem anzugeben, das zum Lesen von Migrationen verwendet wird:
package main
import (
"embed"
"fmt"
"net/url"
"github.com/amacneil/dbmate/v2/pkg/dbmate"
_ "github.com/amacneil/dbmate/v2/pkg/driver/sqlite"
)
//go:embed db/migrations/*.sql
var fs embed. FS
func main () {
u , _ := url . Parse ( "sqlite:foo.sqlite3" )
db := dbmate . New ( u )
db . FS = fs
fmt . Println ( "Migrations:" )
migrations , err := db . FindMigrations ()
if err != nil {
panic ( err )
}
for _ , m := range migrations {
fmt . Println ( m . Version , m . FilePath )
}
fmt . Println ( " n Applying..." )
err = db . CreateAndMigrate ()
if err != nil {
panic ( err )
}
}
Migrationsdateien sind sehr einfach und werden standardmäßig in ./db/migrations
gespeichert. Sie können eine neue Migrationsdatei mit dem Namen [date]_create_users.sql
erstellen, indem Sie dbmate new create_users
ausführen. Hier ist ein Beispiel:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
);
-- migrate:down
drop table if exists users;
Sowohl die Aufwärts- als auch die Abwärtsmigration werden zur einfacheren Bearbeitung in derselben Datei gespeichert. Es sind sowohl Up- als auch Down-Anweisungen erforderlich, auch wenn Sie sich dafür entscheiden, die Down-Migration nicht durchzuführen.
Wenn Sie eine Migration durchführen, speichert dbmate nur die Versionsnummer, nicht den Inhalt. Daher sollten Sie eine Migration immer rückgängig machen, bevor Sie deren Inhalt ändern. Aus diesem Grund können Sie eine Migrationsdatei bedenkenlos umbenennen, ohne dass sich dies auf den angewendeten Status auswirkt, solange Sie die Versionsnummer beibehalten.
Die Schemadatei wird standardmäßig in ./db/schema.sql
geschrieben. Es handelt sich um einen vollständigen Dump Ihres Datenbankschemas, einschließlich aller durchgeführten Migrationen und aller anderen von Ihnen vorgenommenen Änderungen.
Diese Datei sollte in die Quellcodeverwaltung eingecheckt werden, damit Sie die Unterschiede einer Migration problemlos vergleichen können. Mithilfe der Schemadatei können Sie Ihre Datenbank schnell wiederherstellen, ohne alle Migrationen ausführen zu müssen.
Dbmate speichert einen Datensatz jeder angewendeten Migration in der Tabelle mit dem Namen schema_migrations
. Diese Tabelle wird automatisch für Sie erstellt, sofern sie noch nicht vorhanden ist.
Die Tabelle ist ganz einfach:
CREATE TABLE IF NOT EXISTS schema_migrations (
version VARCHAR ( 255 ) PRIMARY KEY
)
Sie können den Namen dieser Tabelle mithilfe des Flags --migrations-table
oder der Umgebungsvariablen DBMATE_MIGRATIONS_TABLE
anpassen.
Warum ein anderes Datenbankschema-Migrationstool? Dbmate wurde von vielen anderen Tools inspiriert, vor allem von Active Record Migrations, mit dem Ziel, einfach zu konfigurieren und sprach- und Framework-unabhängig zu sein. Hier ist ein Vergleich zwischen dbmate und anderen beliebten Migrationstools.
dbmate | Gans | SQL-Migration | golang-migration | aktiver Datensatz | Fortsetzung | Flugbahn | scitch | |
---|---|---|---|---|---|---|---|---|
Merkmale | ||||||||
Einfache SQL-Migrationsdateien | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||
Unterstützung für das Erstellen und Löschen von Datenbanken | ✅ | ✅ | ||||||
Unterstützung für das Speichern von Schema-Dump-Dateien | ✅ | ✅ | ||||||
Mit Zeitstempel versionierte Migrationsdateien | ✅ | ✅ | ✅ | ✅ | ✅ | |||
Tabelle der benutzerdefinierten Schemamigrationen | ✅ | ✅ | ✅ | ✅ | ||||
Möglichkeit zu warten, bis die Datenbank bereit ist | ✅ | |||||||
Aus Umgebungsvariablen geladene Datenbankverbindungszeichenfolge | ✅ | ✅ | ||||||
.env-Datei automatisch laden | ✅ | |||||||
Keine separate Konfigurationsdatei | ✅ | ✅ | ✅ | ✅ | ✅ | |||
Sprach-/Framework-unabhängig | ✅ | ✅ | ✅ | ✅ | ✅ | |||
Treiber | ||||||||
PostgreSQL | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
MySQL | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
SQLite | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
ClickHouse | ✅ | ✅ | ✅ | ✅ |
Sollten Ihnen Ungenauigkeiten in dieser Tabelle auffallen, schlagen Sie bitte eine Änderung vor.
Dbmate ist in Go geschrieben, Pull-Requests sind willkommen.
Tests werden mit Docker Compose für eine echte Datenbank ausgeführt. So erstellen Sie ein Docker-Image und führen die Tests aus:
$ make docker-all
So starten Sie eine Entwicklungsshell:
$ make docker-sh