Datenbankmigration
Datenbank: Migration
Einführung
Migration ist wie eine Datenbankversionskontrolle, die es Teams ermöglicht, die Datenbanktabellenstruktur der Anwendung einfach und problemlos zu bearbeiten und zu teilen In Verbindung mit dem Datenbankstrukturgenerator von Laravel können Sie ganz einfach Ihre Datenbankstruktur erstellen. Wenn Sie jemals einen Kollegen bitten mussten, manuell Felder zu einer Datenbankstruktur hinzuzufügen, kann Ihnen die Datenbankmigration diese Aufgabe ersparen.
Die Schema
-Fassade von Laravel bietet entsprechende Unterstützung für die Erstellung und den Betrieb von Datentabellen für alle von Laravel unterstützten Datenbanksysteme.
Migrationen generieren
Verwenden Sie Artisan-Befehle make:migration
, um Migrationen zu erstellen.
php artisan make:migration create_users_table
Neue Migrationen befinden sich im Verzeichnis database/migrations
. Jeder Migrationsdateiname enthält einen Zeitstempel, damit Laravel die Reihenfolge der Migrationen bestätigen kann. Mit den Optionen
--table
und --create
können Sie den Namen der Datentabelle angeben oder angeben, ob beim Ausführen der Migration eine neue Datentabelle erstellt wird. Diese Optionen müssen beim Vorgenerieren der Migrationsdatei in die angegebene Datentabelle eingetragen werden:
php artisan make:migration create_users_table --create=users php artisan make:migration add_votes_to_users_table --table=users
Wenn Sie einen benutzerdefinierten Ausgabepfad zum Generieren der Migration angeben möchten, können Sie beim Ausführen von make:migration
hinzufügen 🎜> Befehlsoption, der angegebene Pfad muss relativ zum Basispfad der Anwendung sein. --path
und up
. Die down
-Methode wird verwendet, um der Datenbank eine neue Datentabelle, ein neues Feld oder einen neuen Index hinzuzufügen, und die up
-Methode ist die umgekehrte Operation der down
-Methode, die das Gegenteil der Operation in up
ist. up
-Builder von Laravel zum Erstellen und Ändern von Tabellen verwendet. Schema
Um alle im
-Builder verfügbaren Methoden zu verstehen, Schema
sehen Sie sich dessen Dokumentation an . Zum Beispiel ein einfaches Beispiel für die Erstellung einer -Tabelle: flights
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateFlightsTable extends Migration{ /** * 运行数据库迁移 * * @return void */ public function up() { Schema::create('flights', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('airline'); $table->timestamps(); }); } /** * 回滚数据库迁移 * * @return void */ public function down() { Schema::drop('flights'); } }Run migrationExecute Artisan command
Um alle ausstehenden Migrationen auszuführen: migrate
php artisan migrate
{Hinweis} Wenn Sie eine Homestead-VM verwenden, sollten Sie diesen Befehl in Ihrer VM ausführen.Erzwingen einer Migration in einer Produktionsumgebung Einige Migrationsvorgänge sind destruktiv, was zu Datenverlust führen kann. Um zu verhindern, dass jemand diese Befehle in einer Produktionsumgebung ausführt, wird das System dies mit Ihnen bestätigen, bevor diese Befehle ausgeführt werden. Wenn Sie die Ausführung des Befehls unabhängig von den Systemaufforderungen erzwingen möchten, können Sie das
-Tag verwenden: --force
php artisan migrate --forceRollback-MigrationUm die letzte Migration rückgängig zu machen, können Sie den Befehl
verwenden. Mit diesem Befehl wird der letzte „Migrations“-Vorgang rückgängig gemacht, der mehrere Migrationsdateien enthalten kann: rollback
php artisan migrate:rollbackSie können den Parameter
nach dem Befehl rollback
hinzufügen, um die Anzahl der Personen zu begrenzen, die ein Rollback durchführen können die Migrationsnummer. Mit dem folgenden Befehl werden beispielsweise die letzten fünf Migrationen rückgängig gemacht: step
php artisan migrate:rollback --step=5
Der Befehl kann alle Migrationen in der Anwendung rückgängig machen: migrate:reset
php artisan migrate:reset
Verwenden Sie einen einzigen Befehl, um ein Rollback oder eine Migration durchzuführen. Der Befehl
migrate:refresh
macht nicht nur alle Migrationen der Datenbank rückgängig, sondern führt anschließend auch den Befehl migrate
aus. Mit diesem Befehl kann die gesamte Datenbank effizient neu erstellt werden:
php artisan migrate:refresh // 刷新数据库结构并执行数据填充 php artisan migrate:refresh --seed
Verwenden Sie den Befehl refresh
und geben Sie den Parameter step
an, um ein Rollback durchzuführen und die zuletzt angegebene Anzahl von Migrationen erneut auszuführen. Mit dem folgenden Befehl werden beispielsweise die letzten fünf Migrationen zurückgesetzt und erneut ausgeführt:
php artisan migrate:refresh --step=5
Alle Tabellen löschen und migrieren
Der Befehl migrate:fresh
löscht alle aus der Datenbanktabelle, dann führen Sie migrate
aus Befehl:
php artisan migrate:fresh php artisan migrate:fresh --seed
Datentabelle
Datentabelle erstellen
kann verwendet werden Schema
Fassadenmethode create
zum Erstellen einer neuen Datenbanktabelle. Die create
-Methode akzeptiert zwei Parameter: Der erste Parameter ist der Name der Datentabelle und der zweite Parameter ist Closure
. Dieser Abschluss erhält ein Blueprint
-Objekt, das zum Definieren einer neuen Datentabelle verwendet wird:
Schema::create('users', function (Blueprint $table) { $table->increments('id'); });
Natürlich können Sie beim Erstellen einer Datentabelle die Feldmethode eines beliebigen Datenbankstrukturgenerators verwenden, um die Felder der Datentabelle zu definieren.
Überprüfen Sie, ob die Datentabelle/das Datenfeld vorhanden ist
Sie können die Methoden hasTable
und hasColumn
verwenden, um zu überprüfen, ob die Datentabelle oder das Datenfeld vorhanden ist:
if (Schema::hasTable('users')) { // } if (Schema::hasColumn('users', 'email')) { // }
Datenbankverbindung und Tabellenoptionen
Wenn Sie Strukturoperationen an einer Datenbankverbindung durchführen möchten, die nicht die Standardverbindung ist, können Sie die connection
-Methode verwenden:
Schema::connection('foo')->create('users', function (Blueprint $table) { $table->increments('id'); });
, die Sie verwenden kann auf dem Datenbankstrukturgenerator verwendet werden. Der folgende Befehl definiert Tabellenoptionen:
命令 | 描述 |
---|---|
$table->engine = 'InnoDB'; | 指定表存储引擎 (MySQL)。 |
$table->charset = 'utf8'; | 指定数据表的默认字符集 (MySQL)。 |
$table->collation = 'utf8_unicode_ci'; | 指定数据表默认的排序规则 (MySQL)。 |
$table->temporary(); | 创建临时表 (不支持 SQL Server)。 |
Datentabelle umbenennen/löschen
Um die Datentabelle umzubenennen, können Sie die Methode rename
verwenden:
Schema::rename($from, $to);
Um eine vorhandene Datentabelle zu löschen, verwenden Sie drop
oder dropIfExists
Methode:
Schema::drop('users');Schema::dropIfExists('users');
Eine Datentabelle mit Fremdschlüsseln umbenennen
Bevor Sie die Tabelle umbenennen, sollten Sie überprüfen, ob in der Migrationsdatei alle Fremdschlüsseleinschränkungen für die Tabelle vorhanden sind Verwenden Sie einen expliziten Namen, anstatt Laravel einen Namen per Konvention festlegen zu lassen. Andernfalls verweist der Einschränkungsname des Fremdschlüssels auf den alten Tabellennamen. Feld erstellen
wird verwendet Die -Methode der -Fassade kann eine vorhandene Datentabelle aktualisieren. Wie die
-Methode akzeptiert dieSchema::table('users', function (Blueprint $table) {
$table->string('email');
});
Verfügbare Feldtypen
Der Datenbankstrukturgenerator enthält verschiedene Feldtypen, die beim Erstellen einer Tabelle angegeben werden können:
Befehl | Beschreibung |
---|---|
$table->bigIncrements('id'); | Inkrement-ID ( Primärschlüssel), entspricht „UNSIGNED BIG“. INTEGER" |
$table->bigInteger('votes'); | Entspricht BIGINT |
$table->binary('data'); | Entspricht BIGINT BLOB |
$table->boolean('confirmed'); | entspricht BOOLEAN |
$table->char('name', 100); | entspricht mit Länge CHAR |
$table->date('created_at'); | entspricht DATE |
$table->dateTime('created_at'); | entspricht DATETIME |
$table->dateTimeTz('created_at'); | entspricht mit der Zeitzone DATETIME |
$table->decimal('amount', 8, 2); | ist äquivalent zu Mit Präzision und Basis DECIMAL |
$table->double('amount', 8, 2); | entspricht DOUBLE |
$table->enum('level', ['easy', 'hard']); | mit Präzision und Basis >entspricht ENUM |
$table->float('amount', 8, 2); | entspricht FLOAT |
$table->geometry('positions'); | Entspricht GEOMETRIE |
$table->geometryCollection('positions'); | Entspricht GEOMETRYCOLLECTION |
$table->increments('id'); | aufsteigende ID (Primärschlüssel), entspricht „UNSIGNED INTEGER“ |
$table->integer('votes'); | Entspricht INTEGER |
$table->ipAddress('visitor'); | entspricht der IP-Adresse |
$table->json('options'); | entspricht Zu JSON |
$table->jsonb('options'); | entspricht JSONB |
$table->lineString('positions'); | entspricht LINESTRING |
$table->longText('description'); | Entspricht LONGTEXT |
$table->macAddress('device'); | Entspricht MAC Adresse |
$table->mediumIncrements('id'); | Inkrementierende ID (Primärschlüssel), entspricht „UNSIGNED MEDIUM INTEGER“ |
$table->mediumInteger('votes'); | Entspricht MEDIUMINT |
$table->mediumText('description'); | entspricht MEDIUMTEXT |
$table->morphs('taggable'); | entspricht dem Hinzufügen eines inkrementierenden taggable_id mit der Zeichenfolge taggable_type |
$table->multiLineString('positions'); | Entspricht MULTILINESTRING |
$table->multiPoint('positions'); | entspricht MULTIPOINT |
$table->multiPolygon('positions'); | entspricht MULTIPOLYGON |
$table->nullableMorphs('taggable'); | entspricht der nullbaren Version des Feldes morphs() |
$table->nullableTimestamps(); | Entspricht der nullfähigen Versiontimestamps() Feld |
$table->point('position'); | entspricht POINT |
$table->polygon('positions'); | entspricht POLYGON |
$table->rememberToken(); | entspricht dem Feld remember_token der nullbaren Version von VARCHAR (100) |
$table->smallIncrements('id'); | Inkrement-ID (Primärschlüssel) , entspricht „UNSIGNED SMALL INTEGER“ |
$table->smallInteger('votes'); | entspricht SMALLINT |
$table->softDeletes(); | Entspricht dem Hinzufügen eines Nullwerts deleted_at für das vorläufige Löschen Feld |
$table->softDeletesTz(); | entspricht dem Hinzufügen eines nullbaren deleted_at -Felds mit Zeitzone zum vorläufigen Löschen |
$table->string('name', 100); | Entspricht der Gürtellänge VARCHAR |
$table->text('description'); | entspricht TEXT |
$table->time('sunrise'); | entspricht ZEIT |
$table->timeTz('sunrise'); | entspricht ZEIT |
$table->timestamp('added_on'); | mit Zeitzone Äquivalent At TIMESTAMP |
$table->timestampTz('added_on'); | Äquivalent zu TIMESTAMP mit Zeitzone |
$table->timestamps(); | Äquivalent Yu Kekongs created_at und updated_at TIMESTAMP |
$table->timestampsTz(); | entspricht created_at , das leer ist und eine Zeitzone hat, und updated_at TIMESTAMP |
$table->tinyIncrements('id'); | entspricht der automatischen Erhöhung UNSIGNED TINYINT |
$table->tinyInteger('votes'); | Entspricht TINYINT |
$table->unsignedBigInteger('votes'); | Entspricht Unsigned BIGINT |
$table->unsignedDecimal('amount', 8, 2); | entspricht UNSIGNED DECIMAL |
$table->unsignedInteger('votes'); | Entspricht Unsigned INT |
$table->unsignedMediumInteger('votes'); | Entspricht Unsigned MEDIUMINT |
$table->unsignedSmallInteger('votes'); | ist äquivalent zu Unsigned SMALLINT |
$table->unsignedTinyInteger('votes'); | ist äquivalent zu Unsigniert TINYINT |
$table->uuid('id'); | entspricht UUID |
$table->year('birth_year'); | entspricht JAHR |
Feldmodifikation
Zusätzlich zu den oben aufgeführten Feldtypen gibt es mehrere „Modifikatoren“, die beim Hinzufügen von Feldern zu Datenbanktabellen verwendet werden können. Wenn Sie beispielsweise ein Feld „nullbar“ machen möchten, können Sie die Methode nullable
verwenden:
Schema::table('users', function (Blueprint $table) { $table->string('email')->nullable(); });
Im Folgenden finden Sie eine Liste aller verfügbaren Feldmodifikatoren. Diese Liste enthält nicht den Indexmodifikator :
Modifier | Description |
---|---|
->after('column') | 将此字段放置在其它字段 "之后" (MySQL) |
->autoIncrement() | 将 INTEGER 类型的字段设置为自动递增的主键 |
->charset('utf8') | 指定一个字符集 (MySQL) |
->collation('utf8_unicode_ci') | 指定列的排序规则 (MySQL/SQL Server) |
->comment('my comment') | 为字段增加注释 (MySQL) |
->default($value) | 为字段指定 "默认" 值 |
->first() | 将此字段放置在数据表的 "首位" (MySQL) |
->nullable($value = true) | 此字段允许写入 NULL 值(默认情况下) |
->storedAs($expression) | 创建一个存储生成的字段 (MySQL) |
->unsigned() | 设置 INTEGER 类型的字段为 UNSIGNED (MySQL) |
->useCurrent() | 将 TIMESTAMP 类型的字段设置为使用 CURRENT_TIMESTAMP 作为默认值 |
->virtualAs($expression) | 创建一个虚拟生成的字段 (MySQL) |
Feld ändern
Voraussetzungen
Bevor Sie ein Feld ändern, stellen Sie bitte sicher, dass Fügen Sie doctrine/dbal
-Abhängigkeiten zur Datei composer.json
hinzu. Die Doctrine DBAL-Bibliothek wird verwendet, um den aktuellen Status eines Felds zu ermitteln und die SQL-Abfragen zu erstellen, die erforderlich sind, um bestimmte Anpassungen am Feld vorzunehmen:
composer require doctrine/dbal
Feldeigenschaften aktualisieren
change
Methoden können vorhandene Feldtypen in neue Typen ändern oder Eigenschaften ändern.
Zum Beispiel möchten Sie vielleicht erhöhen. Die Länge des Zeichenfolgenfelds. Sie können die Methode change
verwenden, um die Länge des Felds name
von 25 auf 50 zu erhöhen:
Schema::table('users', function (Blueprint $table) { $table->string('name', 50)->change(); });
Wir sollten das Feld so ändern, dass es nullbar ist:
Schema::table('users', function (Blueprint $table) { $table->string('name', 50)->nullable()->change(); });
{Hinweis} Nur die folgenden Feldtypen können „geändert“ werden: bigInteger, Binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger und unsignedSmallInteger.
Felder umbenennen
Felder können mit der Methode renameColumn
im Strukturgenerator umbenannt werden. Bevor Sie ein Feld umbenennen, stellen Sie bitte sicher, dass die composer.json
-Abhängigkeit zu Ihrer doctrine/dbal
-Datei hinzugefügt wurde:
Schema::table('users', function (Blueprint $table) { $table->renameColumn('from', 'to'); });
{Hinweis} Das Umbenennen von Feldern vom Typ Aufzählung wird derzeit nicht unterstützt.
Felder löschen
Felder können mit der Methode dropColumn
im Strukturgenerator gelöscht werden. Bevor Sie Felder aus der SQLite-Datenbank löschen, müssen Sie die composer.json
-Abhängigkeit zur doctrine/dbal
-Datei hinzufügen und composer update
im Terminal ausführen, um die Abhängigkeit zu installieren:
Schema::table('users', function (Blueprint $table) { $table->dropColumn('votes'); });
Sie können ein Feldarray an übergeben dropColumn
Methode zum Löschen mehrerer Felder:
Schema::table('users', function (Blueprint $table) { $table->dropColumn(['votes', 'avatar', 'location']); });
{Hinweis} Wird bei Verwendung von SQLite nicht unterstützt Datenbank beim Löschen oder Ändern mehrerer Felder in einer einzigen Migration.
Verfügbare Befehlsaliase
Command | Description |
---|---|
$table->dropRememberToken(); | 删除 remember_token 字段。 |
$table->dropSoftDeletes(); | 删除 deleted_at 字段。 |
$table->dropSoftDeletesTz(); | dropSoftDeletes() 方法的别名。 |
$table->dropTimestamps(); | 删除 created_at and updated_at 字段。 |
$table->dropTimestampsTz(); | dropTimestamps() 方法的别名。 |
Index
Index erstellen
Der Strukturgenerator unterstützt mehrere Arten von Indizes. Geben Sie zunächst an, dass der Feldwert eindeutig ist, rufen Sie also einfach die Methode unique
in einer Kette nach der Felddefinition auf, um einen Index zu erstellen, zum Beispiel:
$table->string('email')->unique();
Alternativ können Sie auch den Index erstellen nach der Definition des Feldes. Zum Beispiel:
$table->unique('email');
Sie können sogar ein Array an die Indexmethode übergeben, um einen zusammengesetzten (oder synthetischen) Index zu erstellen:
$table->index(['account_id', 'created_at']);
Laravel Ein sinnvoller Indexname wird automatisch generiert, Sie können aber auch einen zweiten Parameter übergeben, um den Indexnamen anzupassen:
$table->unique('email', 'unique_email');
Verfügbare Indextypen
pro Indexmethode Beide akzeptieren eine optionaler zweiter Parameter zur Angabe des Namens des Index. Wenn es weggelassen wird, werden Namen basierend auf Tabellen- und Spaltennamen generiert.
命令 | 描述 |
---|---|
$table->primary('id'); | 添加主键 |
$table->primary(['id', 'parent_id']); | 添加复合键 |
$table->unique('email'); | 添加唯一索引 |
$table->index('state'); | 添加普通索引 |
$table->spatialIndex('location'); | 添加空间索引(不支持 SQLite) |
Indexlänge & Mysql/MariaDB
Laravel verwendet standardmäßig die utf8mb4
-Kodierung, die das Speichern von emojis
in der Datenbank unterstützt. Wenn Sie einen Index für eine MySQL-Version vor 5.7.7 oder eine MariaDB-Version vor 10.2.2 erstellen, müssen Sie die Standardzeichenfolgenlänge für die Datenbankmigration manuell konfigurieren.
Das heißt, rufen Sie die Methode AppServiceProvider
in Schema::defaultStringLength
auf, um sie zu konfigurieren:
use Illuminate\Support\Facades\Schema; /** * 引导任何应用程序服务 * * @return void */ public function boot() { Schema::defaultStringLength(191); }
Natürlich können Sie auch die Option innodb_large_prefix
der Datenbank aktivieren. Informationen zur korrekten Aktivierung finden Sie in der Datenbankdokumentation.
Index umbenennen
Um einen Index umzubenennen, müssen Sie die Methode renameIndex
aufrufen. Diese Methode akzeptiert den aktuellen Indexnamen als erstes Argument und den gewünschten Namen als zweites Argument:
Sie müssen den aktuellen Indexnamen als erstes Argument und den neuen Indexnamen als übergeben Als zweiter Parameter:
$table->renameIndex('from', 'to')
Index löschen
Um den Index zu löschen, müssen Sie den Indexnamen angeben. Standardmäßig verkettet Laravel automatisch einfach den Datenbanknamen, den Indexfeldnamen und den Indextyp als Namen. Zum Beispiel:
命令 | 描述 |
---|---|
$table->dropPrimary('users_id_primary'); | 从 users 表中删除主键 |
$table->dropUnique('users_email_unique'); | 从 users 表中删除唯一索引 |
$table->dropIndex('geo_state_index'); | 从 geo 表中删除基本索引 |
$table->dropSpatialIndex('geo_location_spatialindex'); | 从 geo 表中删除空间索引(不支持 SQLite) |
Wenn das Feldarray an die Methode dropIndex
übergeben wird, wird der basierend auf Tabellenname, Feld und Schlüsseltyp generierte Indexname gelöscht.
Schema::table('geo', function (Blueprint $table) { $table->dropIndex(['state']); // 删除 'geo_state_index' 索引 });
Fremdschlüsseleinschränkungen
Laravel unterstützt auch die Erstellung von Einschränkungen zur Durchsetzung der referenziellen Integrität in der Datenbankschicht Foreign Haupteinschränkungen. Definieren wir beispielsweise ein posts
-Feld in der users
-Tabelle, das auf das id
-Feld der user_id
-Tabelle verweist:
Schema::table('posts', function (Blueprint $table) { $table->unsignedInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); });
Sie können auch die erforderlichen Werte für on delete
und < angeben 🎜> Attribute Operation: on update
$table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade');Sie können die Methode
verwenden, um Fremdschlüssel zu löschen. Fremdschlüsseleinschränkungen werden auf die gleiche Weise benannt wie Indizes. Das heißt, verketten Sie den Datentabellennamen und das eingeschränkte Feld sowie dropForeign
Suffix: _foreign
$table->dropForeign('posts_user_id_foreign');Alternativ können Sie auch ein Feldarray übergeben. Beim Löschen wird das Feld entsprechend der Vereinbarung in den entsprechenden Fremdschlüsselnamen umgewandelt:
$table->dropForeign(['user_id']);Sie können Folgendes verwenden in der Migrationsdatei Methode zum Aktivieren oder Deaktivieren von Fremdschlüsseleinschränkungen:
Schema::enableForeignKeyConstraints(); Schema::disableForeignKeyConstraints();
{Hinweis} SQLite deaktiviert Fremdschlüsseleinschränkungen standardmäßig. Wenn Sie SQLite verwenden, stellen Sie sicher, dass in der Datenbankkonfiguration (/docs/laravel/5.8/database#configuration) die Option [Fremdschlüsselunterstützung aktivieren] aktiviert ist, bevor Sie versuchen, sie in einer Migration zu erstellen.Dieser Artikel wurde zuerst auf der Website