数据库迁移¶
注意
Phalcon 迁移已从 DevTools 中移除并迁移到单独的存储库。
包的 Git 仓库¶
https://github.com/phalcon/migrations
需求¶
- PHP >= 7.5
 - Phalcon >= 5.0.0
 
通过 Composer 安装¶
快速开始¶
快速开始所需的条件:
- 配置文件位于您项目根目录(您也可以在 CLI 环境中将它们作为参数传递)
 - 创建数据库表结构
 - 执行命令以生成迁移
 
之后,您可以在另一个环境中执行该迁移(运行)以创建相同的数据库结构。
创建配置文件¶
<?php
use Phalcon\Config\Config;
return new Config([
    'database'    => [
        'adapter'  => 'mysql',
        'host'     => '127.0.0.1',
        'username' => 'root',
        'password' => '',
        'dbname'   => 'db-name',
        'charset'  => 'utf8',
    ],
    'application' => [
        'logInDb'              => true,
        'migrationsDir'        => 'db/migrations',
        // true - TIMESTAMP, false - versions
        'migrationsTsBased'    => true, 
        'exportDataFromTables' => [
            // Tables names
        ],
    ],
]);
注意
如果exportDataFromTables已设置,则数据将在每次迁移时导出
生成迁移¶
基本生成
**生成特定表并从中导出数据
vendor/bin/phalcon-migrations generate \
    --config=migrations.php \
    --table=users \
    --exportDataFromTables=users \
    --data=oncreate
运行迁移¶
列出现有迁移¶
使用示例¶
从特定迁移目录运行迁移
<?php
use Phalcon\Migrations\Migrations;
$migration = new Migrations();
$migration::run([
    'migrationsDir' => [
        __DIR__ . '/migrations',
    ],
    'config' => [
        'database' => [
            'adapter' => 'Mysql',
            'host' => 'phalcon-db-mysql',
            'username' => 'root',
            'password' => 'root',
            'dbname' => 'vokuro',
        ],
    ]
]);
迁移方法¶
每个迁移是一个单独的类,它作为一个特定数据库表的实体工作。在每个类内,不同的方法可能在迁移运行期间发生。
每个迁移文件(和类)可以实现特定方法,这些方法将根据请求的操作执行。每个方法封装的逻辑没有限制。
下表显示了迁移类的方法。它们按执行顺序存储,从最早到最晚。
向上运行
| 方法名称 | 描述 | 
|---|---|
morph |  修改表结构 | 
afterCreateTable |  在表创建后立即执行某些操作 | 
up |  表已创建并准备好使用 | 
afterUp |  用于某些特定情况的额外方法 | 
向下运行
| 方法名称 | 描述 | 
|---|---|
down |  通常在这里放置表删除或数据清空 | 
aferDown |  全部清理后工作的额外方法 | 
morph |  (来自前一个迁移) 因为迁移被回退,所有内容都需要返回到之前的状态 | 
CLI 参数和选项¶
参数
| 参数 | 描述 | 
|---|---|
generate |  生成迁移 | 
run |  运行迁移 | 
list |  列出所有可用迁移 | 
选项
| 动作 | 描述 | 
|---|---|
--config=s |  配置文件 | 
--migrations=s |  迁移目录。使用逗号分隔的字符串来指定多个目录 | 
--directory=s |  创建项目的目录 | 
--table=s |  要迁移的表。表名或带有星号的表前缀。默认:全部 | 
--version=s |  要迁移的版本 | 
--descr=s |  迁移描述(用于基于时间戳的迁移) | 
--data=s |  导出数据 ['always' 或 'oncreate'](数据在迁移运行期间导入) | 
--exportDataFromTables=s |  从特定表导出数据,使用逗号分隔的字符串 | 
--force |  强制覆盖现有迁移 | 
--ts-based |  基于时间戳的迁移版本 | 
--log-in-db |  在数据库表中保留迁移日志而不是文件中 | 
--dry |  尝试请求的操作而不对系统进行更改(仅用于生成) | 
--verbose |  在操作期间输出调试信息(仅用于运行) | 
--no-auto-increment |  禁用自增(仅用于生成) | 
--skip-ref-schema |  跳过生成迁移中的 referencedSchema(仅用于生成) | 
--skip-foreign-checks |  包裹SET FOREIGN_KEY_CHECKS查询在执行查询前后(仅用于运行) |  
--help |  显示此帮助 | 
基于时间戳的迁移¶
使用这种方法在多个开发者参与数据库结构管理时非常有用。在配置文件中使用'migrationsTsBased' => true或在 CLI 环境中使用--ts-based选项。此外,您需要指定后缀descr,它可以是任何您想要的内容,例如:语义版本。
当前命令
将生成具有此类名称的文件夹名
迁移将按照从旧到新的顺序执行。
注意
无论何时运行迁移,应用程序都会扫描所有可用迁移及其状态,而不考虑其“年龄”。如果在之前的运行中有一个或多个未被执行,则将在下一次运行时执行。