【云+社区年度征文】数据库迁移工具是什么 PHP Phinx如何引入到框架使用

2020-12-03 17:36:45 浏览数 (1)

什么是Phinx

关于Git和Svn,想必各位开发者都已经很熟悉了,用于多人协作,版本控制。

在数据库方面,也一样拥有版本控制的工具,那就是今天的主题“数据库迁移工具”

并不仅仅是Phinx这个库(它只是PHP上常用的库)

数据库迁移工具可以帮我们:

  • 迁移到不同架构的数据库 如mysql和oracle等
  • 测试环境上线过程部署脚本
  • 表结构变动可追踪、可回滚

执行原理和优势

迁移到不同架构的数据库

迁移工具内置通过配置值,使用不同的数据库驱动,执行不同的sql组成,达到创建相同结构的表的需求

测试环境上线过程部署脚本

以往我们上线都需要在测试本地导出sql文件,然后到线上导入,这个过程很容易出错,甚至因为版本差异等问题,导入失败。

使用迁移工具,只需要运行一行命令,迁移工具将会帮我们逐个逐个表进行创建和插入初始数据

方便同事部署测试环境、以及项目上线

表结构变动可追踪、可回滚

如题,跟git等工具一样,它提供了版本更新记录和回滚的功能,发现问题可以快速回滚到旧版本结构。

可以记录某次表结构的用户是由哪个用户变动的(配合git等工具 查询迁移文件变更者)

修改原理

此次主题,是讲PHP的数据库迁移工具Phinx引入到第三方框架。

默认执行引入Phinx安装后,是会生成一个初始化配置文件,此时不会使用到框架的数据库配置文件,在切换环境和上线过程,需要修改的配置文件增多,容易遗漏,造成异常。

我们需要在Phinx.php中 引入框架的配置文件,修改对应的栏位 即可共用框架的配置文件

EasySwoole引入示例

代码语言:txt复制
<?php

defined('SWOOLE_VERSION') or define('SWOOLE_VERSION', intval(phpversion('swoole')));
defined('EASYSWOOLE_ROOT') or define('EASYSWOOLE_ROOT', realpath(getcwd()));
defined('EASYSWOOLE_SERVER') or define('EASYSWOOLE_SERVER', 1);
defined('EASYSWOOLE_WEB_SERVER') or define('EASYSWOOLE_WEB_SERVER', 2);
defined('EASYSWOOLE_WEB_SOCKET_SERVER') or define('EASYSWOOLE_WEB_SOCKET_SERVER', 3);

$databaseConfig = require_once "./dev.php";
define('PHINX_PRE', $databaseConfig['MYSQL']['prefix']);

return
[
    'paths' => [
        'migrations' => EASYSWOOLE_ROOT.'/database/migrations',
        'seeds' => EASYSWOOLE_ROOT.'/database/seeds'
    ],
    'environments' => [
        'default_migration_table' => PHINX_PRE.'migrate_logs',
        'default_environment' => 'development',
        'production' => [
            'adapter' => 'mysql',
            'host' => $databaseConfig['MYSQL']['host'],
            'name' => $databaseConfig['MYSQL']['database'],
            'user' => $databaseConfig['MYSQL']['user'],
            'pass' => $databaseConfig['MYSQL']['password'],
            'port' => $databaseConfig['MYSQL']['port'],
            'charset' => $databaseConfig['MYSQL']['charset'],
        ],
        'development' => [
            'adapter' => 'mysql',
            'host' => $databaseConfig['MYSQL']['host'],
            'name' => $databaseConfig['MYSQL']['database'],
            'user' => $databaseConfig['MYSQL']['user'],
            'pass' => $databaseConfig['MYSQL']['password'],
            'port' => $databaseConfig['MYSQL']['port'],
            'charset' => $databaseConfig['MYSQL']['charset'],
        ],
        'testing' => [
            'adapter' => 'mysql',
            'host' => $databaseConfig['MYSQL']['host'],
            'name' => $databaseConfig['MYSQL']['database'],
            'user' => $databaseConfig['MYSQL']['user'],
            'pass' => $databaseConfig['MYSQL']['password'],
            'port' => $databaseConfig['MYSQL']['port'],
            'charset' => $databaseConfig['MYSQL']['charset'],
        ]
    ],
    'version_order' => 'creation'
];

其他框架

在Thinkphp中也是一样的道理 只需要require 配置文件,替换变量使用即可

尾语

官网:https://book.cakephp.org/phinx/0/en/index.html

中文翻译手册: https://www.kancloud.cn/liujin/phinx-doc/580899

这里说一下 ,Thinkphp官方已经提供了对Phinx工具的封装包,但是我为什么不使用呢?

我查看了Thinkphp官方包的依赖以及更新记录,已经很久没更新了,对于Phinx也不是通过composer来依赖,而是下载源码硬性引入,可能无法更新Phinx版本,无法使用最新的特性,所以我还是引入了Phinx原生包,使用基础原生的它。

还是挺可惜的, 如果有精力的小伙伴,可以尝试更新维护它,让社区更加繁荣!

希望有更多的人,更多的开发者,分享自己的经验。

0 人点赞