数据库:迁移
介绍
迁移就像是数据库的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构。迁移通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构。如果团队中有成员在他的本地数据库环境中手动的添加了某个字段,那么你将会面对如何解决数据库迁移的问题。
Laravel 9 Schema
facade 提供了数据库相关的支持,可以在所有 Laravel 支持的数据库管理系统中创建和操作表 。
生成迁移
你可以使用 make:migration
Artisan command 生成数据库迁移。新的迁移将放在你的 database/migrations
目录每个迁移文件名都包含一个时间戳,允许 Laravel 确定迁移的顺序:
php artisan make:migration create_flights_table
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 将执行不属于数据库结构的剩余的所有迁移。
你应该将数据库模式文件提交给源代码管理,以便团队中的其他新开发人员可以快速创建应用程序的初始数据库结构。
注意:整合迁移仅适用于 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
{
/**
* 运行迁移程序
*
* @return void
*/
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
/**
* 回滚迁移
*
* @return void
*/
public function down()
{
Schema::drop('flights');
}
};
设置迁移连接
如果你的迁移将与应用程序默认数据库连接以外的数据库连接进行交互,你应该设置迁移的 $connection
属性:
/**
* 迁移应使用的数据库连接。
*
* @var string
*/
protected $connection = 'pgsql';
/**
* 执行迁移
*
* @return void
*/
public function up()
{
//
}
执行迁移
执行 Artisan 命令 migrate
,来运行所有未执行过的迁移:
php artisan migrate
如果你想查看目前已经执行了哪些迁移,可以使用 migrate:status
Artisan 命令:
php artisan migrate:status
在生产环境中执行强制迁移
有些迁移操作是破坏性的,这意味着它们可能会导致数据丢失。为了防止你对生产数据库运行这些命令,在执行这些命令之前,系统将提示你进行确认。如果要在运行强制命令的时候去掉提示,需要加上 --force
标志:
php artisan migrate --force
回滚迁移
如果要回滚最后一次迁移操作,可以使用 Artisan 命令 rollback
。该命令会回滚最后「一批」的迁移,这可能包含多个迁移文件:
php artisan migrate:rollback
通过向 rollback
命令加上 step
参数,可以回滚指定数量的迁移。例如,以下命令将回滚最后五个迁移:
php artisan migrate:rollback --step=5
命令 migrate:reset
会回滚应用已运行过的所有迁移:
php artisan migrate:reset
使用单个命令同时进行回滚和迁移操作
命令 migrate:refresh
首先会回滚已运行过的所有迁移,随后会执行 migrate
。这一命令可以高效地重建你的整个数据库:
php artisan migrate:refresh
# 重置数据库,并运行所有的 seeds...
php artisan migrate:refresh --seed
通过在命令 refresh
中使用 step
参数,你可以回滚并重新执行指定数量的迁移操作。例如,下列命令会回滚并重新执行最后五个迁移操作:
php artisan migrate:refresh --step=5
删除所有表然后执行迁移
命令 migrate:fresh
会删去数据库中的所有表,随后执行命令 migrate
:
php artisan migrate:fresh
php artisan migrate:fresh --seed
注意:该命令 migrate:fresh
在删去所有数据表的过程中,会无视它们的前缀。如果数据库涉及到其它应用,使用该命令须十分小心。
数据表
创建数据表
接下来我们将使用 Schema 的 create
方法创建一个新的数据表。create
接受两个参数:第一个参数是表名,而第二个参数是一个闭包,该闭包接受一个用来定义新数据表的 Blueprint
对象:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email');
$table->timestamps();
});
创建表时,可以使用数据库结构构建器的 列方法 来定义表的列。
检查表 / 列是否存在
你可以使用 hasTable
和 hasColumn
方法检查表或列是否存在:
if (Schema::hasTable('users')) {
// 「users」表存在...
}
if (Schema::hasColumn('users', 'email')) {
// 「users」表存在,并且有「email」列...
}