PHP数据库迁移:现代工具与实践
数据库迁移是现代PHP开发中不可或缺的一部分。它使开发团队能够同步数据库模式的变更,追踪变更历史,并在不同环境(本地环境、预发布环境、生产环境)中自动应用这些变更。本文将介绍PHP中主要的迁移库和工具,包括它们的安装、配置和使用示例。
什么是迁移,为什么需要它们?
数据库迁移是一个脚本,用于描述模式的变更:创建表、添加/删除列、索引、外键。迁移可以实现:
- 版本控制:将数据库结构变更与应用程序代码一同进行版本管理。
- 自动化:在新服务器上自动部署。
- 回滚:在需要时撤销变更。
- 团队协作:避免冲突。
PHP中流行的迁移库
1. Phinx (robmorgan/phinx)
Phinx 是最流行的独立迁移库之一。它不绑定特定框架,支持 MySQL、PostgreSQL、SQLite、SQL Server。
通过 Composer 安装:
composer require robmorgan/phinx创建配置文件 phinx.yml:
paths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds'
environments: default_migration_table: phinxlog default_database: development development: adapter: mysql host: localhost name: myapp_db user: root pass: '' port: 3306 charset: utf8迁移示例(创建 users 表):
<?php
use Phinx\\Migration\\AbstractMigration;
class CreateUsersTable extends AbstractMigration{ public function change() { $table = $this->table('users', ['id' => false, 'primary_key' => ['id']]); $table->addColumn('id', 'biginteger', ['identity' => true]) ->addColumn('username', 'string', ['limit' => 50]) ->addColumn('email', 'string', ['limit' => 100]) ->addColumn('created_at', 'datetime') ->addColumn('updated_at', 'datetime', ['null' => true]) ->addIndex(['email'], ['unique' => true]) ->create(); }}运行迁移:
vendor/bin/phinx migrate -e development2. Doctrine Migrations (doctrine/migrations)
Doctrine Migrations 是 Doctrine ORM 生态系统的一部分。非常适合已经使用 Doctrine 的项目。支持所有主流数据库管理系统。
安装:
composer require doctrine/migrations配置 (migrations.php):
<?phpreturn [ 'table_storage' => [ 'table_name' => 'doctrine_migration_versions', ], 'migrations_paths' => [ 'App\\Migrations' => './migrations', ], 'all_or_nothing' => true, 'transactional' => true, 'check_database_platform' => true,];迁移示例:
<?php
namespace App\\Migrations;
use Doctrine\\DBAL\\Schema\\Schema;use Doctrine\\Migrations\\AbstractMigration;
class Version20240101000000 extends AbstractMigration{ public function up(Schema $schema): void { $table = $schema->createTable('products'); $table->addColumn('id', 'integer', ['autoincrement' => true]); $table->addColumn('name', 'string', ['length' => 255]); $table->addColumn('price', 'decimal', ['precision' => 10, 'scale' => 2]); $table->se