CodeIgniter 4迁移默认关闭,需将app/Config/Migrations.php中$enabled设为true,否则php spark migrate静默跳过;路径、命名(YYYYMMDDHHIISS_描述.php)、执行位置(项目根目录)任一错误均导致“Nothing to migrate”或无反应。

CodeIgniter 4 的数据库迁移不是“开箱即用”,必须手动启用、路径对、命名准、位置对,否则 php spark migrate 会静默失败或显示 Nothing to migrate.
为什么 php spark migrate 没反应或提示 Nothing to migrate.
最常见原因是迁移功能根本没启用。CI4 默认关闭迁移,不会报错也不会提示。
-
app/Config/Migrations.php中的$enabled必须设为true,否则所有迁移命令都被跳过 -
$path必须指向真实存在的目录,默认是APPPATH . 'Database/Migrations/',路径错一个字符,文件就读不到 - CLI 命令必须在项目根目录(含
spark文件那层)执行,否则ROOTPATH解析错位,操作的是空目录或错误数据库 - 迁移文件名格式必须严格为
YYYYMMDDHHIISS_描述.php(如20231015142230_create_users_table.php),时间戳少一位、下划线写成短横、大小写混用,都会被忽略
up() 和 down() 怎么写才安全不翻车
别手写原生 SQL —— 跨数据库(MySQL/PostgreSQL/SQLite)和回滚时大概率出错。
- 建表、加字段、改类型、删索引,一律用
$this->forge,比如$this->forge->addField(...)、$this->forge->addColumn(...) -
up()里避免DROP TABLE IF EXISTS,先用$this->forge->tableExists('xxx')判断再操作 -
down()不是up()的反向拼接:比如addColumn对应dropColumn,但modifyColumn回滚时得按原始定义重建字段,不能只删 - 如果迁移中更新了数据(如初始化配置项),
down()必须能还原那条记录,否则php spark migrate:rollback会失败或留脏数据
怎么精准运行单个迁移文件(调试/补救专用)
CI4 原生命令不支持指定单个文件,但 MigrationRunner::force() 方法可绕过依赖检查直接执行。
- 先创建自定义命令:
php spark make:command MigrateFile --command migrate:file --group Database --suffix Command - 替换
app/Commands/MigrateFileCommand.php的run()方法,核心是调用$runner->force(ROOTPATH . $filePath, $namespace, $dbgroup) - 使用示例:
php spark migrate:file "app/Database/Migrations/20231015142230_create_users_table.php" - 注意:该方式跳过依赖校验和时间戳顺序,仅用于调试、补跑或模块化部署,生产环境慎用
php spark migrate:status 显示 pending 却不执行
说明迁移文件已被识别,但卡在依赖或状态不同步上。
- 检查迁移类里的
public $depends = ['20231015142230_create_users_table'];—— 时间戳必须完全匹配其他迁移文件名前缀,错一个数字或字母就卡住 - 手动清空过
migrations表?Spark 不会自动重算,需用php spark migrate:refresh(清空重跑,危险)或php spark migrate:to 20231015142230指定目标版本 - SQLite 用户特别注意:
ALTER TABLE ... RENAME COLUMN在旧版 SQLite 不支持,modifyColumn可能静默失败
迁移文件的时间戳既是执行顺序依据,也是状态同步锚点;一旦手动改过文件名或数据库中的 migrations 表记录,后续所有依赖判断都会失准——这点最容易被忽略,也最难排查。


















