pdo轻量级php数据迁移工具通过时间戳命名的迁移类(含up/down方法)、migrations表记录状态、预处理sql与事务控制实现版本化变更;支持mysql/postgresql适配,提供up/down/status命令行操作。

用 PDO 实现轻量级 PHP 数据迁移工具,核心是把数据库变更操作(建表、改字段、加索引等)封装成可版本化、可回滚的 PHP 类,并通过统一入口按顺序执行。
1. 迁移文件结构设计
每个迁移文件对应一个 PHP 类,实现 up() 和 down() 方法,命名带时间戳便于排序:
202405010930_create_users_table.php202405021420_add_email_index_to_users.php
类需继承统一基类(如 Migrator),自动注入 PDO 实例,避免重复连接。
2. 迁移状态管理
用一张 migrations 表记录已执行的迁移文件名和执行时间:
立即学习“PHP免费学习笔记(深入)”;
CREATE TABLE migrations ( id INT AUTO_INCREMENT PRIMARY KEY, migration VARCHAR(255) NOT NULL, batch INT NOT NULL, executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
每次运行迁移前,读取该表对比待执行文件列表,跳过已执行项;回滚时按时间倒序取最近 N 条并调用其 down() 方法。
3. PDO 操作安全封装
不直接拼 SQL,而是用 PDO 预处理 + 动态构建语句。例如添加字段:
- 检测字段是否存在(查
INFORMATION_SCHEMA.COLUMNS) - 使用
$pdo->exec("ALTER TABLE users ADD COLUMN status TINYINT DEFAULT 1") - 捕获异常并回滚事务(
beginTransaction()/rollback())
对 MySQL、PostgreSQL 等不同驱动,可抽象出适配器层,统一处理语法差异(如 PostgreSQL 的 ADD COLUMN IF NOT EXISTS 不支持,需手动判断)。
4. 命令行入口与简单调度
写一个 migrate.php 脚本,支持基础命令:
-
php migrate.php up:执行所有未执行迁移 -
php migrate.php down --step=1:回滚最近 1 次 -
php migrate.php status:列出已执行/待执行迁移
解析参数后加载迁移类,用 require_once 引入,再反射调用方法,避免自动加载冲突。
不复杂但容易忽略的是事务边界控制和驱动兼容性处理——PDO 本身不抽象 DDL,必须针对目标数据库做细粒度适配。











