laravel笔记:migration的作用与实现
Migration 的核心作用是在多人协作中,像使用版本控制器(如 Git)管理代码一样来管理你的数据库,从而避免使用sql脚本文件的互传。
它允许你和你的团队在应用中定义、共享和维护数据库结构的变化,确保所有开发人员、测试服务器和生产服务器的数据库结构始终保持一致。
在没有迁移功能之前,团队协作开发时,数据库结构的管理通常非常麻烦:
开发者A 在本地数据库添加了一个新表或新字段。
开发者B 也需要进行同样的修改,他需要手动执行 SQL 语句或从A那里获取SQL脚本。
很容易出错,或者忘记执行某个修改,导致代码运行失败。
部署到生产环境时,DBA 或运维人员需要根据开发的变化,手动整理和执行SQL脚本,过程繁琐且易遗漏。
Migration 完美地解决了这些问题:
1. 版本化与协同工作
每个迁移文件通常代表一次数据库结构的更改(例如:create_users_table, add_votes_to_users_table)。
这些文件被放在项目的 database/migrations/ 目录下,可以纳入版本控制系统(如 Git)。
当其他开发者拉取(pull)你的代码后,只需要运行一条命令 php artisan migrate,Laravel 就会自动执行他们本地尚未运行过的迁移文件,使他们的数据库结构立刻与你的一致。
2. 数据库无关性
迁移让你可以使用 PHP 代码 和 流畅的、富有表现力的语法 来定义数据表结构,而不是原生的 SQL。
Laravel 的 Schema 构建器支持所有主流数据库系统(MySQL, PostgreSQL, SQLite, SQL Server)。
这意味着你写一套迁移代码,可以无缝地在不同的数据库驱动上运行,无需为不同数据库编写不同的 SQL 脚本。
示例:创建一个 flights 表
php
// database/migrations/2024_08_19_000000_create_flights_table.php
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->id(); // 自增 ID,主键
$table->string('name');
$table->string('airline');
$table->timestamps(); // 自动创建 created_at 和 updated_at 字段
});
}
这段代码非常易读,并且可以用于创建任何支持的数据库表。
3. 可逆性(回滚)
每个迁移文件都包含两个核心方法:up() 和 down()。
up(): 用于执行新的更改(创建表、添加字段等)。
down(): 用于撤销 up() 方法所做的更改(删除表、移除字段等)。
这让你可以轻松地回退到之前的数据库状态。
常用回滚命令:
php artisan migrate:rollback: 回滚上一次的迁移操作。
php artisan migrate:rollback --step=5: 回滚最近5次迁移操作。
php artisan migrate:reset: 回滚所有已运行的迁移(清空所有表)。
4. 部署与同步
在部署应用到生产环境时,你只需要在服务器上运行 php artisan migrate(通常作为部署脚本的一部分)。
Laravel 会检查 migrations 表(该表由框架自动创建,用于记录已运行的迁移),然后只执行那些还未运行的迁移文件。
这确保了生产环境的数据库结构总是与代码库中定义的最新结构完全同步,极大地简化了部署流程。
5. 保持一致性
迁移强制要求团队使用统一的、定义良好的方式来修改数据库。
它成为了数据库结构变化的“唯一真相源”,所有人都基于这套迁移文件工作,避免了手动修改数据库可能带来的混乱和不一致。
评论已关闭