PHP 数据库迁移:工具与库完全指南
PHP Web 应用程序的开发与数据库结构的管理密不可分。在项目演进过程中,数据库模式不断变化:添加新表、修改字段、引入索引。在不同环境(本地环境、预发布环境、生产环境)下手动执行 SQL 查询会导致错误、数据丢失和混乱。解决此问题的方法是数据库迁移——一种以编程方式对模式变更进行版本控制和应用的方法。
什么是迁移以及为什么需要它们?
迁移是一个包含两个方法的 PHP 类:up()(应用变更)和 down()(回滚变更)。每个迁移都有一个唯一标识符(通常是时间戳),并按顺序执行。使用迁移的主要优点:
- 数据库模式版本控制——所有变更历史都存储在代码中(通常使用 Git)。
- 部署自动化——只需执行一个命令即可更新任何服务器上的数据库。
- 安全性——能够回滚失败的变更。
- 团队协作——所有开发人员自动同步数据库结构。
PHP 中流行的迁移库
我们来介绍三种最常用的工具:Phinx、Doctrine Migrations 以及内置的 Laravel Migrations。
1. Phinx (robmorgan/phinx)
Phinx 是一个独立于框架的迁移和数据填充(用测试数据填充)工具。它支持 MySQL、PostgreSQL、SQLite、SQL Server 等数据库管理系统。通过 Composer 安装:
composer require robmorgan/phinx创建用户表的迁移示例:
<?phpuse Phinx\\Migration\\AbstractMigration;
class CreateUsersTable extends AbstractMigration{ public function up() { $table = $this->table('users'); $table->addColumn('username', 'string', ['limit' => 50]) ->addColumn('email', 'string') ->addColumn('password', 'string') ->addColumn('created_at', 'datetime') ->addIndex(['email'], ['unique' => true]) ->create(); }
public function down() { $this->table('users')->drop()->save(); }}Phinx 提供了方便的 DSL(领域特定语言)来描述模式,并内置了对数据填充(seeders)的支持。主要命令:
phinx migrate——应用所有新的迁移。phinx rollback——回滚上一次迁移。phinx status——显示迁移状态。phinx seed:run——用测试数据填充数据库。
2. Doctrine Migrations
Doctrine Migrations 是 Doctrine ORM 生态系统的一部分,但也可以独立使用。它与 Doctrine DBAL(数据库抽象层)有强大的集成。安装:
composer require doctrine/migrations使用 Doctrine DBAL 的迁移示例:
<?phpuse Doctrine\\DBAL\\Migrations\\AbstractMigration;use Doctrine\\DBAL\\Schema\\Schema;
class Version20240101000000 extends AbstractMigration{ public function up(Schema $schema) { $table = $schema->createTable('users'); $table->addColumn('id', 'integer', ['autoincrement' => true]); $table->addColumn('username', 'string', ['length' => 50]); $table->addColumn('email', 'string'); $table->setPrimaryKey(['id']); $table->addUniqueIndex(['email']); }
public function down(Sc