星河避难所

返回

收藏版:Phinx 数据库迁移完全指南Blur image

最近在维护老项目时,又一次用到了 Phinx。 这个工具我已经用了很多年,几乎每个项目都会用上它。它属于那种平时不常用,但每个项目都离不开 的工具。

问题在于,它用得不频繁,每次写迁移脚本时总会忘记某个参数怎么写、某个字段该用什么类型。 这些当然可以去查官方文档,但 Phinx 的文档虽然内容齐全,却总让我觉得信息分散、查起来不够顺手

于是,我干脆花点时间,把自己常用的命令、配置方式、字段类型和参数说明都系统地整理了一遍。 一方面方便自己查阅,另一方面也希望能帮到同样在项目中使用 Phinx 的开发者。

如果你也在 PHP 项目里用 Phinx 管理数据库迁移,这篇文章或许能成为你的「快捷参考手册」。


前期配置#

安装 Phinx#

composer require robmorgan/phinx
bash

初始化配置#

执行初始化命令:

vendor/bin/phinx init
shell

该命令会在项目根目录下生成一个 phinx.php 配置文件。
配置文件中:

  • paths 用于指定迁移脚本与填充脚本的路径;
  • environments 用于定义不同环境(例如开发、测试、生产)的数据库配置;
  • 若执行迁移命令时不指定环境,则默认使用 default_environment 指定的环境。

环境配置与 .env 支持#

为了统一管理数据库配置,我习惯用 .env 文件来维护连接信息。
但由于 phinx 脚本并不运行在 PHP 框架生命周期内,常见的 .env 加载方式(如 Laravel 的)无法直接使用,因此我通常会额外安装 vlucas/phpdotenv

composer require vlucas/phpdotenv
bash

然后在 phinx.php 中添加如下配置:


常用命令#

创建迁移文件#

vendor/bin/phinx create 迁移名称
shell

Phinx 会自动根据时间戳与名称生成迁移文件。
命名建议保持统一规范:

  • 创建表Create + 表名 → 例如 CreateUsersTable
  • 修改表Modify + 表名 + 操作 → 例如 ModifyUsersAddStatus
  • 删除表Delete + 表名 → 例如 DeleteOldLogsTable

Phinx 会自动将大驼峰命名转为蛇形文件名,例如 CreateUsersTable20251028123045_create_users_table.php


执行迁移#

没什么好说的,执行这个命令即可执行迁移

vendor/bin/phinx migrate
shell

参数说明:

  • -e:指定环境(默认 production
  • -t:指定执行到的版本号(不传则执行到最新)
  • --dry-run:仅打印 SQL 而不实际执行

注意:-t 不是只执行单个版本,而是顺序执行直到目标版本号为止。


设置断点(Breakpoint)#

生产环境中执行迁移后,建议立刻设置断点。
断点能防止误操作导致大规模回滚。

vendor/bin/phinx breakpoint
bash

参数:

  • -e 环境名
  • -t 版本号
  • -r 删除断点

回滚迁移#

慎用!
迁移的回滚会撤销数据库结构更改,例如删除表或字段,表中数据会全部丢失。
生产环境不建议直接回滚,而是通过新的迁移来完成结构恢复。

vendor/bin/phinx rollback
bash

参数说明:

  • -e 环境名
  • -t 指定版本号(或 0 回滚全部)
  • -d 按日期回滚(YYYYmmddHHiiss
  • -f 强制回滚(忽略断点)
  • --dry-run 仅打印 SQL 不执行

查看状态#

用于查看迁移执行状态,确认哪些迁移尚未执行。

vendor/bin/phinx status
shell

参数说明:

  • -e:环境名

创建填充(Seeder)#

vendor/bin/phinx seed:create 填充名称
bash

命名建议使用表名 + 填充描述,例如:

UsersAddDemoDataSeeder
plaintext

执行填充:

vendor/bin/phinx seed:run
bash

参数:

  • -e 指定环境
  • -s 指定执行的 Seeder,可多次传入

迁移脚本详解#

支持的字段类型#

Phinx 在 MySQL 下支持的字段类型如下:

类型MySQL 类型必需参数说明
smallintegerSMALLINT小整数
integerINT常规整数
bigintegerBIGINT大整数
floatFLOAT单精度浮点数
doubleDOUBLE双精度浮点数
decimalDECIMAL(M,D)precision,scale定点小数(金额等)
bitBIT位字段
booleanTINYINT(1)布尔值(0/1)
charCHAR(n)limit定长字符串
stringVARCHAR(n)limit可变长度字符串
textTEXT文本
enumENUM(…)values枚举类型
setSET(…)values集合类型
uuidCHAR(36)UUID字符串
dateDATE日期
timeTIME时间
datetimeDATETIME日期与时间
timestampTIMESTAMP时间戳
binaryBINARY(n)limit定长二进制数据
blobBLOB二进制大对象
tinyblobTINYBLOB小型二进制
mediumblobMEDIUMBLOB中型二进制
longblobLONGBLOB超大二进制
jsonJSONJSON 数据类型

常用字段参数#

参数名类型说明
limit / lengthint长度或字节限制
defaultmixed默认值
nullbool是否允许为 NULL
afterstring放置在某个字段之后(或 \Phinx\Db\Adapter\MysqlAdapter::FIRST )
commentstring字段注释
precisionint小数总位数
scaleint小数位数
signedbool是否允许负数
valuesarray/string枚举或集合可选值,英文逗号隔开的字符串或数组
identitybool是否自增(需搭配 null:false)

各种操作调用代码#

如果对表格形式不感兴趣,可以直接通过以下完整迁移脚本理解字段定义方式。

填充脚本(Seeder)示例#

老项目迁移接入#

如果你是从已有数据库切换到 Phinx,可使用 phinx-migrations-generator 自动生成迁移文件。

composer require odan/phinx-migrations-generator --dev
bash

它会直接读取现有的 phinx.php 配置,无需额外设置。
执行以下命令即可生成当前数据库结构的迁移文件:

vendor/bin/phinx-migrations generate
bash

最后#

Phinx 是一个非常轻量却强大的迁移工具,适用于几乎所有独立 PHP 项目。
写这篇笔记的初衷很简单——自己每次都要重新翻文档太麻烦了,不如干脆整理一份系统化的版本。
如果你也有相同的困扰,希望这篇文章能让你变得方便一些 觉得有用的话,别忘了收藏这篇文章~ 更多内容可以在我的网站 https://hejunjie.life 查看

收藏版:Phinx 数据库迁移完全指南
http://www.hejunjie.life/blog/d92j5hsf
作者 何俊杰
发布时间 2025年10月28日
版权信息 CC BY-NC-SA 4.0
评论似乎卡住了,尝试刷新?✨