Yii 的 yii migrate/create 默认只生成空迁移文件,不读取数据库表结构;Gii 的迁移生成器也不扫描数据库,仅基于已有模型类生成 createTable() 代码;真正能根据现有表生成完整迁移的工具是社区扩展 yii2-migration-generator。

yii migrate/create 生成空迁移但没表结构?
Yii 的 yii migrate/create 默认只建空文件,不读表、不生成字段。它不是「反向工程工具」,本质是手动写迁移的起点。想根据现有表自动生成 up() 和 down(),得靠额外命令或扩展。
gii 生成 migration 能读当前数据库表吗?
不能。Gii 的 Migration Generator(gii/migration)只支持「从模型类生成迁移」,且前提是模型已存在、对应表也存在。它不会扫描数据库 schema 来推导字段——它连数据库连接都不走,纯靠 PHP 类反射。
- 你得先用
gii/model生成模型,再用gii/migration基于该模型生成迁移 - 生成的迁移里只有
createTable(),字段类型来自模型注解或默认映射(比如string→VARCHAR(255)),不是真实 DB 类型 - 如果表有索引、外键、CHECK 约束,Gii 一概不生成
真正能根据表生成 migration 的方案:yii2-migration-generator
社区扩展 yii2-migration-generator 是目前最接近需求的工具。它连接数据库,读取表结构(含字段、主键、索引、外键),输出可运行的迁移代码。
- 安装:
composer require --dev "skeeks/yii2-migration-generator" - 执行:
yii migrate-gen/create user(假设表叫user) - 生成的迁移会包含
createTable()+addPrimaryKey()+createIndex(),字段类型尽量贴近 MySQL/PostgreSQL 实际定义 - 注意:不支持视图、存储过程;PostgreSQL 的序列、自增处理需手动核对;MySQL 的
TINYINT(1)可能被识别为布尔,但 Yii 迁移不原生支持boolean,得改成tinyint并加注释
手写迁移时字段类型最容易错在哪?
直接抄 SQL 建表语句里的类型(比如 VARCHAR(191)、TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)进 createTable(),大概率报错或行为异常。
-
string(191)可以,但varchar(191)不行——Yii 迁移只认抽象类型名,不是 SQL 原生类型 -
datetime和timestamp在 Yii 中都映射到DATETIME,无法表达 MySQL 的自动更新逻辑,得用execute()补充原始 SQL -
json类型在 MySQL 5.7+ 支持,但旧版 Yii 2.0.x 的json抽象类型实际生成的是TEXT,得手动写'json' => 'JSON'
NOT NULL 却没给默认值,迁移就卡住。


















