Hyperf 数据库迁移通过 php bin/hyperf.php migrate 命令驱动,基于 doctrine/dbal 和自封装迁移管理器实现,不依赖 Laravel 框架但复用其约定;迁移文件存于 app/Migrations/,命名格式为 YYYY_MM_DD_HHMMSS_create_users_table.php,需继承 Hyperf\Database\Migrations\Migration 并实现 up() 和 down() 方法;支持 --step、--rollback、--reset、--status、--database 等参数,配置读取 config/autoload/database.php,首次运行前需手动创建数据库,调试可用 --pretend 查看 SQL。

Hyperf 的数据库迁移通过 php bin/hyperf.php migrate 命令驱动,本质是基于 Laravel 的 doctrine/dbal 和 Hyperf 自封装的迁移管理器实现的。它不依赖 Laravel 框架,但复用了其迁移约定和执行逻辑。
迁移文件生成与存放位置
迁移文件需放在 app/Migrations/ 目录下(默认路径,可配置),命名格式为 YYYY_MM_DD_HHMMSS_create_users_table.php。推荐使用命令自动生成:
php bin/hyperf.php migrate:make create_users_table- 也可手动创建,但必须继承
Hyperf\Database\Migrations\Migration类,并实现up()和down()方法 - 每个迁移类中,
up()用于建表/改结构,down()用于回滚操作,需保证可逆
执行迁移与常见参数
运行迁移主命令即可批量执行待执行的迁移:
-
php bin/hyperf.php migrate— 执行所有未执行的迁移 -
php bin/hyperf.php migrate --step=1— 仅执行 1 个迁移(适合逐步验证) -
php bin/hyperf.php migrate:rollback— 回滚上一次 migrate(即执行最后一个迁移的 down) -
php bin/hyperf.php migrate:reset— 清空全部已执行迁移(慎用) -
php bin/hyperf.php migrate:status— 查看各迁移文件执行状态(Ran / Not Ran)
配置与连接适配
迁移命令读取 config/autoload/database.php 中的默认连接配置。若项目有多个数据库连接(如 mysql、mysql_log),可通过 --database=xxx 指定:
php bin/hyperf.php migrate --database=mysql_log- 确保对应连接的
driver、host、database等配置正确,否则会报 PDO 连接异常 - 首次运行迁移前,目标数据库需已存在(Hyperf 不自动创建库),例如先手动执行
CREATE DATABASE my_app CHARACTER SET utf8mb4;
调试与问题排查
迁移失败时,错误信息通常直接输出在终端。常见问题及处理方式:
-
SQLSTATE[42S01]: Base table or view already exists:说明表已存在,检查是否重复执行或
up()中未判断表是否存在(可用$this->schema->hasTable('xxx')防御) -
Class not found:迁移类命名空间错误,确认文件顶部为
namespace App\Migrations;,且类名与文件名一致 -
No migrations found:检查
app/Migrations/路径是否被扫描到,或是否漏写use Hyperf\Database\Migrations\Migration; - 想查看真实执行的 SQL?加
--pretend参数,例如php bin/hyperf.php migrate --pretend










