PHP数据库迁移:工具与库完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 development


2. 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

推荐