flameartlab / migration
为 Yii 2 生成迁移的生成器。
Requires
- yiisoft/yii2: ~2.0.8
README
迁移创建器和更新器
根据现有数据库表和之前的迁移生成迁移文件。
此分支新增功能
- 新增命令
fill table_name。您可以为复制所有表行创建迁移。此功能能够正确处理空值和 NULL 值 - 添加了对键索引(唯一索引也正常工作)的迁移
- 为
create <table>模块中的表添加了 注释 - 错误修复
安装
将包添加到您的 composer.json 中
{
"require": {
"flameartlab/migration": "*"
}
}
然后运行 composer update 或运行 composer require flameartlab/migration
基本配置
在您的配置文件中添加以下内容(最好是控制台配置文件)
'components' => [
// ...
],
'controllerMap' => [
'migration' => [
'class' => 'bizley\migration\controllers\MigrationController',
],
],
用法
以下控制台命令可用
php yii migration
或
php yii migration/list
列出数据库中的所有表。
php yii migration/create table_name
生成创建数据库表 table_name 的迁移。
php yii migration/create-all
生成创建所有数据库表的迁移。
php yii migration/update table_name
生成更新数据库表 table_name 的迁移。
php yii migration/update-all
生成更新所有数据库表的迁移。
php yii migration/fill table_name
生成填充数据库表 table_name 的迁移。
您可以通过逗号分隔名称来一次性为多个表生成多个迁移
php yii migration/create table_name1,table_name2,table_name3
更新迁移
从 yii2-migration v2.0 开始,可以为数据库表生成更新迁移。
- 扫描已应用迁移的历史记录以收集对表的所有修改。
- 准备虚拟表模式并与当前表模式进行比较。
- 将差异生成为更新迁移。
- 如果迁移历史记录没有保留有关表创建的信息,则将生成创建迁移。
命令行参数
(1) 请记住,对于不同的数据库类型,一般列模式可能会生成不同长度的模式。
MySQL 示例
列
varchar(45)
generalSchema=0:$this->string(45)
generalSchema=1:$this->string()
列int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
generalSchema=0:$this->integer(11)->notNull()->append('AUTO_INCREMENT PRIMARY KEY')
generalSchema=1:$this->primaryKey()
(2) 您可以将包含无法由提取器覆盖的操作的迁移放置在此处,例如当有迁移使用 authManager 组件设置 RBAC 层级时。这些操作应保存在独立的迁移中并放置在此列表中,以防止在提取过程中运行。
重命名
当您重命名表或列时,请记住手动生成适当的迁移,否则此扩展将不会生成更新迁移(在表的情况下)或生成带有删除原始列并添加重命名列的命令的迁移(在列的情况下)。这是因为它只能比较表的两个状态,而没有知道一个状态是如何变成另一个状态的。虽然迁移重命名列和删除它并添加另一个的最终结果在结构上是相同的,但后者 会使您丢失数据。
一旦将重命名迁移添加到历史记录中,它就会被扩展跟踪。
注意事项
此扩展已在 MySQL 数据库上进行测试,但应与 Yii 2 核心支持的任何数据库类型一起工作
- CUBRID (9.3.x 和更高版本)
- MS SQL Server (2008 和更高版本)
- MySQL (4.1.x 和 5.x)
- Oracle
- PostgreSQL (9.x 和更高版本)
- SQLite (2/3)
如果 MySQL 之外的数据库有问题,请告知我(在 MySQL 的情况下也要告知我)。
据我所知,Yii 2 不保存关于表索引(除了唯一索引)以及外键的 ON UPDATE 和 ON DELETE 操作的信息,所以很遗憾,这些信息无法被跟踪并应用到生成的迁移中——您必须自己添加。
只有扩展 yii\db\Migration 类的迁移历史可以被正确扫描,并且只有使用默认的 yii\db\Migration 方法应用的变化可以被识别(除 execute()、addCommentOnTable() 和 dropCommentFromTable() 方法之外)。对表数据的更改(如 insert()、delete()、truncate() 等)不会被跟踪。