数据库迁移¶
注意
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
,它可以是任何您想要的内容,例如:语义版本。
当前命令
将生成具有此类名称的文件夹名
迁移将按照从旧到新的顺序执行。
注意
无论何时运行迁移,应用程序都会扫描所有可用迁移及其状态,而不考虑其“年龄”。如果在之前的运行中有一个或多个未被执行,则将在下一次运行时执行。