lulco / phoenix
PHP 数据库迁移
Requires
- php: ^7.4|^8.0
- ext-json: *
- ext-pdo: *
- symfony/console: ^5.2.12|^6.0|^7.0
- symfony/finder: ^5.0|^6.0|^7.0
Requires (Dev)
- nette/neon: ^2.3|^3.0
- phpunit/phpunit: ^9.5.11
- ramsey/uuid: ^3.7|^4.0
- symfony/yaml: ^5.0|^6.0|^7.0
Suggests
- nette/neon: Allows use *.neon file as config file and class Phoenix\Config\Parser\NeonConfigParser to parse it
- symfony/yaml: Allows use *.yml / *.yaml file as config file and class Phoenix\Config\Parser\YamlConfigParser to parse it
This package is auto-updated.
Last update: 2024-09-19 13:37:51 UTC
README
PHP 的无框架数据库迁移。
特性
- 全面验证:在执行第一个查询之前验证迁移中的所有设置,确保无错误操作。
- 多目录管理:轻松管理多个迁移目录,提高组织能力。
- 视图支持:完全支持数据库视图,扩展迁移的灵活性。
- 双向迁移:无缝迁移向上和向下,允许平滑过渡和回滚。
- 查询调试:在调试模式下(
-vvv
)打印执行查询,提供透明度并帮助解决问题。 - 干运行模式:在干运行模式下执行迁移,预览更改而不进行任何实际修改,确保安全部署。
- 自动递增列:轻松向现有表添加自动递增主列,简化架构修改。
- 数据库转储:使用转储命令从现有数据库创建迁移,便于轻松设置迁移。
- 数据库比较:生成两个现有数据库之间的差异迁移,简化更改同步。
- 迁移测试:使用执行、回滚和重新执行迁移的命令测试新迁移,确保部署前的可靠性。
- 迁移状态:查看已执行和挂起的迁移的详细状态报告,跟踪迁移历史。
- JSON 输出:所有命令的输出以 JSON 格式获取,便于与其他工具和工作流程集成。
- 命名空间支持:在迁移类中使用命名空间以实现更好的组织和代码管理。
- 自定义模板:创建并使用自己的迁移模板,将过程定制到特定需求。
- 无框架:轻松与任何 PHP 应用程序集成,提供无缝的迁移体验。
- 增强的 PHPStorm 集成:享受 PHPStorm 建议,在使用 deep-assoc-completion 插件时提供增强支持。
- 校对管理:更改所有现有表和列的校对,提供对字符集设置的完全控制。
- 外键控制:在迁移中打开和关闭外键检查,在复杂的架构更改期间提供灵活性。
- 简单的自动装配:在迁移中受益于简单的自动装配,减少样板代码并提高生产力。
支持的适配器
- MySQL
- PostgreSQL
安装
Composer
此库需要 PHP 7.4 或更高版本。它也适用于 PHP 8.0+。将 Phoenix 添加到项目的最快和推荐方式是通过 Composer (https://getcomposer.org.cn/)。
composer require lulco/phoenix
使用
创建配置文件
在项目的根目录中创建 phoenix.php
文件。例如
<?php return [ 'migration_dirs' => [ 'first' => __DIR__ . '/../first_dir', 'second' => __DIR__ . '/../second_dir', ], 'environments' => [ 'local' => [ 'adapter' => 'mysql', 'host' => 'localhost', 'port' => 3306, // optional 'username' => 'user', 'password' => 'pass', 'db_name' => 'my_db', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', // optional, if not set default collation for utf8mb4 is used ], 'production' => [ 'adapter' => 'mysql', 'host' => 'production_host', 'port' => 3306, // optional 'username' => 'user', 'password' => 'pass', 'db_name' => 'my_production_db', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', // optional, if not set default collation for utf8mb4 is used ], ], 'default_environment' => 'local', 'log_table_name' => 'phoenix_log', ];
有关配置的更多信息,请参阅这里。
记住:迁移会对数据库进行一些结构更改,因此用于这些迁移的数据库用户必须能够执行这些更改。
命令
要运行命令,请使用命令运行器 vendor/bin/phoenix
或 vendor/lulco/phoenix/bin/phoenix
。
可用命令
init
- 初始化 phoenixcreate
- 创建迁移migrate
- 运行迁移rollback
- 回滚迁移dump
- 从现有数据库创建迁移diff
- 从两个现有数据库结构创建迁移status
- 已执行的迁移列表和待执行的迁移列表test
- 通过执行 migrate、rollback、migrate 测试下一个迁移cleanup
- 回滚所有迁移并删除日志表
您可以使用 --help
选项运行每个命令以获取更多信息,或阅读更多内容
初始化命令
命令 php vendor/bin/phoenix init
初始化 phoenix 并创建一个数据库表,用于存储已执行的迁移。该命令在首次运行其他命令时自动执行,因此您不需要手动运行它。
创建第一个迁移
创建命令 php vendor/bin/phoenix create <migration> [<dir>]
php vendor/bin/phoenix create "FirstDir\MyFirstMigration" second
这将创建一个名为 {timestamp}_my_first_migration.php
的文件中的 PHP 类 FirstDir\MyFirstMigration
,其中 {timestamp}
表示实际的时间戳,格式为 YmdHis
,例如 20160919082117
。此文件将在迁移目录 second
中创建,该目录配置为 __DIR__ . '/../second_dir'
(请参阅上面的配置示例)。
create
命令创建迁移文件的框架,如下所示
<?php namespace FirstDir; use Phoenix\Migration\AbstractMigration; class MyFirstMigration extends AbstractMigration { protected function up(): void { } protected function down(): void { } }
现在您需要实现两个方法:用于在执行 migrate
命令时使用的 up()
方法,以及用于在执行 rollback
命令时使用的 down()
方法。通常:如果在 up()
方法中创建表,则在 down()
方法中必须删除此表,反之亦然。
假设您需要执行此查询
CREATE TABLE `first_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `url` varchar(255) NOT NULL, `sorting` int(11) NOT NULL, `created_at` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idx_first_table_url` (`url`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
您需要在您的迁移类中实现如下所示的 up()
方法
<?php namespace FirstDir; use Phoenix\Database\Element\Index; use Phoenix\Migration\AbstractMigration; class MyFirstMigration extends AbstractMigration { protected function up(): void { $this->table('first_table') ->addColumn('title', 'string') ->addColumn('url', 'string') ->addColumn('sorting', 'integer') ->addColumn('created_at', 'datetime') ->addIndex('url', Index::TYPE_UNIQUE) ->create(); } }
或者,您可以使用原始 SQL
<?php namespace FirstDir; use Phoenix\Migration\AbstractMigration; class MyFirstMigration extends AbstractMigration { protected function up(): void { $this->execute('CREATE TABLE `first_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `url` varchar(255) NOT NULL, `sorting` int(11) NOT NULL, `created_at` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idx_first_table_url` (`url`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;' ); } }
实现相应的 down()
方法,该方法删除表 first_table
,如下所示
protected function down(): void { $this->table('first_table') ->drop(); }
现在您可以使用 migrate
命令执行您的第一个迁移。
迁移命令
迁移命令 php vendor/bin/phoenix migrate
执行所有可用的迁移。在这种情况下,您将看到如下输出
php vendor/bin/phoenix migrate
Migration FirstDir\MyFirstMigration executing
Migration FirstDir\MyFirstMigration executed. Took 0.0308s
All done. Took 0.0786s
如果您再次运行此命令,将没有迁移要执行,因此输出将如下所示
php vendor/bin/phoenix migrate
Nothing to migrate
All done. Took 0.0451s
如果您想回滚更改(例如,您发现您忘记添加某些列或索引),您可以运行 rollback
命令,更新迁移,然后再次运行 migrate
命令。请注意,最佳实践是在更新迁移代码之前运行 rollback
命令。
回滚命令
回滚命令 php vendor/bin/phoenix rollback
回滚最后一个执行的迁移。在这种情况下,您将看到如下输出
php vendor/bin/phoenix rollback
Rollback for migration FirstDir\MyFirstMigration executing
Rollback for migration FirstDir\MyFirstMigration executed. Took 0.0108s
All done. Took 0.0594s
如果您再次运行此命令,将没有迁移要回滚,因此输出将如下所示
php vendor/bin/phoenix rollback
Nothing to rollback
All done. Took 0.0401s
转储命令
php vendor/bin/phoenix dump
命令从您当前的数据库结构生成迁移文件,使您更容易使用现有表开始使用 Phoenix。这对于在 MySQL 和 PostgreSQL 之间进行转换非常有用。
主要好处
- 快速从现有数据库创建迁移文件。
- 简化 Phoenix 入门。
- 促进数据库引擎迁移。
差异命令
php vendor/bin/phoenix diff
命令通过比较两个现有的数据库结构生成迁移。这对于具有旧版和新版模式的新系统升级非常理想。
有关详细信息,请参阅差异命令文档。
状态命令
运行 php vendor/bin/phoenix status
并显示已执行的迁移列表和待执行的迁移列表。输出如下所示
Executed migrations
+--------------------+---------------------------------------------+---------------------+
| Migration datetime | Class name | Executed at |
+--------------------+---------------------------------------------+---------------------+
| 20160919082117 | FirstDir\MyFirstMigration | 2016-09-26 06:49:49 |
+--------------------+---------------------------------------------+---------------------+
Migrations to execute
+--------------------+---------------------------------+
| Migration datetime | Class name |
+--------------------+---------------------------------+
| 20160921183201 | FirstDir\MySecondMigration |
+--------------------+---------------------------------+
All done. Took 0.2016s
清理命令
清理命令 php vendor/bin/phoenix cleanup
回滚所有已执行的迁移并删除日志表。执行此命令后,应用程序的状态将与执行 init
命令之前的状态相同。
php bin/phoenix cleanup
Rollback for migration FirstDir\MyFirstMigration executed
Phoenix cleaned
测试命令
测试命令 php vendor/bin/phoenix test
首先执行下一个迁移,然后执行回滚并再次迁移第一个迁移。此命令是执行命令的快捷方式。
php bin/phoenix migrate --first
php bin/phoenix rollback
php bin/phoenix migrate --first
输出看起来像这样
php bin/phoenix test
Test started...
Migration FirstDir\MyFirstMigration executing...
Migration FirstDir\MyFirstMigration executed. Took 0.0456s
Rollback for migration FirstDir\MyFirstMigration executing...
Rollback for migration FirstDir\MyFirstMigration executed. Took 0.0105s
Migration FirstDir\MyFirstMigration executing...
Migration FirstDir\MyFirstMigration executed. Took 0.0378s
Test finished successfully
All done. Took 0.2840s
更多关于命令的信息请点击这里 这里