PHP PDO 数据迁移工具实现

2次阅读

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

PHP PDO 数据迁移工具实现

用 PDO 实现轻量级 PHP 数据迁移工具,核心是把数据库变更操作(建表、改字段、加索引等)封装成可版本化、可回滚的 PHP 类,并通过统一入口按顺序执行。

1. 迁移文件结构设计

每个迁移文件对应一个 PHP 类,实现 up()down() 方法,命名带时间戳便于排序:

  • 202405010930_create_users_table.php
  • 202405021420_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,必须针对目标数据库做细粒度适配。

text=ZqhQzanResources