bizley/migration

为 Yii 2 生成迁移。

支持包维护!
bizley

安装次数: 277,298

依赖关系: 14

建议者: 0

安全: 0

星级: 288

关注者: 21

分支: 36

开放问题: 1

类型:yii2-extension

4.4.1 2023-09-05 15:43 UTC

README

Yii 2 Migration

Yii 2 迁移

Latest Stable Version Total Downloads License Infection MSI

迁移创建器和更新器

在理想的世界里,你首先为数据库准备迁移文件,以便在准备就绪时运行它。但既然这不是一个完美的世界,有时你会从一个已经设置好的数据库开始 - 使用这个包,你可以轻松地使用 一个控制台命令 基于你的 DB 架构 创建迁移文件

此外,当你的数据库稍后更新时,你可以 生成一个迁移文件以更新架构到当前状态。该包会将其与迁移历史进行比较

  1. 扫描应用的迁移历史以收集对表的所有修改。
  2. 准备虚拟表架构并与当前表架构进行比较。
  3. 差异作为更新迁移生成。
  4. 如果在迁移历史中未保留有关表的信息,则生成创建迁移。

安装

运行控制台命令

composer require --dev bizley/migration

或将其添加到您的 composer.json 文件中

{
    "require-dev": {
        "bizley/migration": "^4.0"
    }
}

然后运行 composer update

配置

在您的配置文件中添加以下内容(最好是控制台配置文件)

[
    'controllerMap' => [
        'migration' => [
            'class' => 'bizley\migration\controllers\MigrationController',
        ],
    ],
]

以下选项(及其默认值)可用

[
    'controllerMap' => [
        'migration' => [
            'class' => 'bizley\migration\controllers\MigrationController',
            'migrationPath' => '@app/migrations', // Directory storing the migration classes
            'migrationNamespace' => null, // Full migration namespace
            'useTablePrefix' => true, // Whether the table names generated should consider the $tablePrefix setting of the DB connection
            'onlyShow' => false, // Whether to only display changes instead of generating update migration
            'fixHistory' => false, // Whether to add generated migration to migration history
            'skipMigrations' => [], // List of migrations from the history table that should be skipped during the update process
            'excludeTables' => [], // List of database tables that should be skipped for actions with "*"
            'fileMode' => null, // Permission to be set for newly generated migration files
            'fileOwnership' => null, // User and/or group ownership to be set for newly generated migration files
            'leeway' => 0, // Leeway in seconds to apply to a starting timestamp when generating migration
        ],
    ],
]

用法

以下控制台命令可用(假设您将控制器命名为 migration,如下面的示例所示)

  • 列出数据库中的所有表

    php yii migration
    

    php yii migration/list
    
  • 生成创建数据库表 table_name 的迁移

    php yii migration/create "table_name"
    
  • 生成更新数据库表 table_name 的迁移

    php yii migration/update "table_name"
    

    要一次生成数据库中所有表(除了排除的表)的迁移,请使用星号 (*)

    php yii migration/create "*"
    php yii migration/update "*"
    

    您可以通过逗号分隔名称来一次为多个表生成多个迁移

    php yii migration/create "table_name1,table_name2,table_name3"
    

    您可以将星号作为表名的一部分来使用所有匹配该模式的表

    php yii migration/update "prefix_*"
    

    一次创建多个表迁移时,会根据外键的存在强制正确的迁移顺序。当表相互引用时,将在默认生成之后生成额外的外键迁移。

  • 提取迁移 migration_name 的 SQL 语句(UP)(自 4.4.0 版本起新增)

    php yii migration/sql "migration_name"
    
  • 提取迁移 migration_name 的 SQL 语句(DOWN)(自 4.4.0 版本起新增)

    php yii migration/sql "migration_name" "down"
    

命令行参数

[1] 请记住,由于不同的数据库类型,通用列架构可能具有不同的长度。

MySQL 示例

varchar(255)
generalSchema=false: $this->string(255)
generalSchema=true: $this->string()

int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
generalSchema=false: $this->integer(11)->notNull()->append('AUTO_INCREMENT PRIMARY KEY')
generalSchema=true: $this->primaryKey()

当列大小与 DBMS 的默认值不同时,它将被保留
varchar(45)
generalSchema=false: $this->string(45)
generalSchema=true: $this->string(45)

[2] 您可以将包含无法由提取器覆盖的操作的迁移放在此处,例如当有迁移使用 authManager 组件设置 RBAC 层级时。这些操作应保留在单独的迁移中,并放在此列表中,以防止在提取过程中运行它们。

[3] 此模式允许在迁移更新器中使用原始SQL列定义(例如 ['column' => 'varchar(255)'] 而不是 ['column' => $this->string()])。由于此模式中的生成过程依赖于特定DBMS的语法,结果可能不正确。欢迎所有帮助改进此模式的人。

关于重命名表或列的重要信息

当您重命名表或列时,请记住手动生成适当的迁移,否则此扩展将不会生成更新迁移(如果是表的情况)或生成包含删除原始列和添加重命名列的命令的迁移(如果是列的情况)。这是因为yii2-migration只能比较表的两个状态,而不知道一个状态是如何变成另一个状态的。虽然迁移重命名列和删除列并添加另一列的结果在结构上是相同的,但后者会导致您丢失数据

一旦将重命名迁移添加到历史记录中,它就会被扩展跟踪。

从v2或v3迁移到v4

请参阅迁移到版本4.0部分。

注释

此扩展应与Yii 2核心支持的所有数据库类型一起工作

  • CUBRID(9.3.x及以上版本)
  • MS SQL Server(2008及以上版本)
  • MySQL(4.1.x、5.x、8.x)
  • Oracle
  • PostgreSQL(9.x及以上版本)
  • SQLite(2/3)

只有扩展yii\db\Migration类的迁移历史可以被正确扫描,并且只有使用默认yii\db\Migration方法应用的变化可以被识别(除了execute()addCommentOnTable()dropCommentFromTable()方法)。对表数据进行更改(如insert()upsert()delete()truncate()等)不会被跟踪。

更新迁移过程需要createTable()addColumn()alterColumn()方法以提供以yii\db\ColumnSchemaBuilder实例的形式的列定义更改(如$this->string()而不是'varchar(255)')。

4.4.0版的新功能,支持从现有迁移中提取SQL语句,支持yii\db\Migration中所有可用的方法。

测试

提供了MySQL、PostgreSQL和SQLite的测试。数据库配置存储在tests/config.php中(您可以通过创建该位置的config.local.php文件来覆盖它)。
用于设置数据库的Docker Compose文件存储在tests/docker中。

以前版本

这些版本不再开发,但仍对所有受EOL PHP困扰的人提供。其中一些最新功能可能不可用。