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

Migrationsstruktur

Die Migrationsklasse enthält normalerweise 2 Methoden:

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

Bei diesen beiden Methoden wird der

-Builder von Laravel zum Erstellen und Ändern von Tabellen verwendet. SchemaUm alle im
-Builder verfügbaren Methoden zu verstehen, Schemasehen 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 migration

Execute 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 --force

Rollback-Migration

Um 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:rollback

Sie 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 die
-Methode zwei Parameter: Einer ist der Name der Datentabelle und der andere ist ein Abschluss, der eine Instanz von
empfängt, die zum Hinzufügen von Feldern zur Tabelle verwendet werden kann:

Schema::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:

mit Präzision und Basis mit Präzision und Basis
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 :

ModifierDescription
->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 dropColumnMethode 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

CommandDescription
$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