数据库: 迁移
介绍
迁移就像数据库的版本控制,允许你的团队定义和共享应用程序的数据库架构定义。 如果你曾经不得不告诉团队成员在从代码控制中拉取更新后手动添加字段到他们的本地数据库,那么你就遇到了数据库迁移解决的问题。
Laravel Schema
facade 为所有 Laravel 支持的数据库系统的创建和操作表提供了不依赖于数据库的支持。通常情况下,迁移会使用 facade 来创建和修改数据 表和字段。
生成迁移
你可以使用 make:migration
Artisan 命令 来生成数据库迁移。新的迁移文件将放在你的 database/migrations
目录下。每个迁移文件名都包含一个时间戳来使 Laravel 确定迁移的顺序:
php artisan make:migration create_flights_table
Laravel 将使用迁移文件的名称来猜测表名以及迁移是否会创建一个新表。如果 Laravel 能够从迁移文件的名称中确定表的名称,它将在生成的迁移文件中预填入指定的表,或者,你也可以直接在迁移文件中手动指定表名。
如果要为生成的迁移指定自定义路径,你可以在执行 make:migration
命令时使用 --path
选项 。给定的路径应该相对于应用程序的基本路径。
可以使用 stub publishing 自定义发布。
整合迁移
在构建应用程序时,可能会随着时间的推移积累越来越多的迁移。这可能会导致你的 database/migrations
目录因为数百次迁移而变得臃肿。你如果愿意的话,可以将迁移「压缩」到单个 SQL 文件中。如果你想这样做,请先执行schema:dump
命令:
php artisan schema:dump
# 转储当前数据库架构并删除所有现有迁移...
php artisan schema:dump --prune
执行此命令时,Laravel 将向应用程序的 database/schema
目录写入一个「schema」文件。现在,当你尝试迁移数据库而没有执行其他迁移时,Laravel 将首先执行模式文件的 SQL 语句。在执行数据库结构文件的语句之后,Laravel 将执行不属于数据库结构的剩余的所有迁移。
如果你的应用程序的测试使用的数据库连接与你在本地开发过程中通常使用的不同,你应该确保你已经使用该数据库连接转储了一个 schema 文件,以便你的测试能够建立你的数据库。你可能希望在切换(dump)你在本地开发过程中通常使用的数据库连接之后再做这件事。
php artisan schema:dump
php artisan schema:dump --database=testing --prune
你应该将数据库模式文件提交给源代码管理,以便团队中的其他新开发人员可以快速创建应用程序的初始数据库结构。
整合迁移仅适用于 MySQL、PostgreSQL 和 SQLite 数据库,并使用数据库命令行的客户端。另外,数据库结构不能还原到内存中的 SQLite 数据库。
迁移结构
迁移类包含两个方法:up
和 down
。up
方法用于向数据库中添加新表、列或索引,而 down 方法用于撤销 up
方法执行的操作。.
在这两种方法中,可以使用 Laravel 模式构建器来富有表现力地创建和修改表。要了解 Schema
构建器上可用的所有方法,查看其文档。例如,以下迁移会创建一个 flights
表:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* 执行迁移
*/
public function up(): void
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
/**
* 回滚迁移
*/
public function down(): void
{
Schema::drop('flights');
}
};
设置迁移连接
如果你的迁移将与应用程序默认数据库连接以外的数据库连接进行交互,你应该设置迁移的 $connection
属性:
/**
* The database connection that should be used by the migration.
*
* @var string
*/
protected $connection = 'pgsql';
/**
* 执行迁移
*/
public function up(): void
{
// ...
}
执行迁移
执行 Artisan 命令 migrate
,来运行所有未执行过的迁移:
php artisan migrate
如果你想查看目前已经执行了哪些迁移,可以使用 migrate:status
Artisan 命令:
php artisan migrate:status
如果你希望在不实际运行迁移的情况下看到将被执行的SQL语句,你可以在 migrate
命令中提供 --pretend
选项。
php artisan migrate --pretend
在隔离的环境中执行迁移
如果你在多个服务器上部署你的应用程序,并在部署过程中运行迁移,你可能不希望两个 服务器同时尝试迁移数据库。为了避免这种情况,你可以在调用 migrate
命令时使用 isolated
选项。
当提供 isolated
选项时, Laravel 将使用你的应用程序缓存驱动获得一个原子锁,然后再尝试运行你的迁移。所有其他试图运行 migrate
命令的尝试在锁被持有时都不会执行; 然而, 命令仍然会以成功的退出状态码退出:
php artisan migrate --isolated
要使用这个功能,你的应用程序必须使用 memcached
/ redis
/ dynamodb
/ database
/ file
或 array
缓存驱动作为你应用程序的默认缓存驱动。此外,所有的服务器必须与同一个中央缓存服务器进行通信。
在生产环境中执行强制迁移
有些迁移操作是破坏性的,这意味着它们可能会导致数据丢失。为了防止你对生产数据库运行这些命令,在执行这些命令之前,系统将提示你进行确认。如果要在运行强制命令的时候去掉提示,需要加上 --force
标志:
php artisan migrate --force
回滚迁移
如果要回滚最后一次迁移操作,可以使用 Artisan 命令 rollback
。该命令会回滚最后「一批」的迁移,这可能包含多个迁移文件:
php artisan migrate:rollback
通过向 rollback
命令加上 step
参数,可以回滚指定数量的迁移。例如,以下命令将回滚最后五个迁移:
php artisan migrate:rollback --step=5
你可以通过向 rollback
命令提供 batch
选项来回滚特定的批次迁移,其中 batch
选项对应于应用程序中 migrations
数据库表中的一个批次值。例如,下面的命令将回滚第三批中的所有迁移。
php artisan migrate:rollback --batch=3
命令 migrate:reset
会回滚应用已运行过的所有迁移:
php artisan migrate:reset