当前位置: 首页 > 工具软件 > Phinx > 使用案例 >

[robmorgan/phinx]一款专门做数据库迁移的神器,再也不用费劲导入导出了

冯旭
2023-12-01

在我们分发安装我们的产品的时候,安装数据库是非常麻烦的,基本上你能做的就是导出一份数据库文件,然后封装一个一键安装数据库的功能.这还好,但是如果产品升级了,数据库有了改动,这时候处理起来就很麻烦了,既要兼容旧版本的数据,又要保持新的版本数据库完整.

不过不要怕,那是因为你不知道phinx这样神器.

phinx能够让我们的PHP产品在安装数据库时,变得非常简单,只要编辑一份代码,就可以直接安装到四款不同的数据库中,并且支持跟随版本变动,随时修改数据库表结构.

phinx的追求目标如下:

  • 只要作为composer依赖加载即可
  • 与PHP框架本身独立
  • 非常方便的安装
  • 支持简单易用的命令行
  • 可以集成到其他工具(Phing, PHPUnit) 和框架中

基本用法

首先调用命令创建一个迁移文件,我们在这个文件里设置数据库的结构:

vendor/bin/phinx create MyNewMigration

然后写上这样一段代码:

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    public function change()
    {
        $users = $this->table('users');
        $users->addColumn('username', 'string', ['limit' => 20])
              ->addColumn('password', 'string', ['limit' => 40])
              ->addColumn('password_salt', 'string', ['limit' => 40])
              ->addColumn('email', 'string', ['limit' => 100])
              ->addColumn('first_name', 'string', ['limit' => 30])
              ->addColumn('last_name', 'string', ['limit' => 30])
              ->addColumn('created', 'datetime')
              ->addColumn('updated', 'datetime', ['null' => true])
              ->addIndex(['username', 'email'], ['unique' => true])
              ->create();
    }
}

就这样我们就已经设计好了一个users表,然后调用命令,让数据库生成这个表结构:

phinx migrate 

然后就可以在数据库中发现这个表了.

数据库表结构的跟踪升级

或许以后我们升级产品,会发现不需要这个users表了,这时候我们只要新建另一个迁移文件,这样写:

<?php

use Phinx\Migration\AbstractMigration;

class MyNewMigration extends AbstractMigration
{
    /**
     * Migrate Up.
     */
    public function up()
    {
        $this->table('users')->drop()->save();
    }

    /**
     * Migrate Down.
     */
    public function down()
    {
        $users = $this->table('users');
        $users->addColumn('username', 'string', ['limit' => 20])
              ->addColumn('password', 'string', ['limit' => 40])
              ->addColumn('password_salt', 'string', ['limit' => 40])
              ->addColumn('email', 'string', ['limit' => 100])
              ->addColumn('first_name', 'string', ['limit' => 30])
              ->addColumn('last_name', 'string', ['limit' => 30])
              ->addColumn('created', 'datetime')
              ->addColumn('updated', 'datetime', ['null' => true])
              ->addIndex(['username', 'email'], ['unique' => true])
              ->save();
    }
}

这样当我们试图执行安装命令时,会执行up方法,删除users表,但是phinx支持降级,当我们试图回退到某个版本时,会调用down方法,恢复这个users表.

比如回退到某一版本:

phinx rollback -e development -t 20120103083322

支持多款数据库

像上面两个文件,我们执行之后,既可以安装到mysql,也可以直接安装到其他数据库,比如sqlite等,无需任何代码改动,真正做到数据库设计一次,安装多个.

  • MySQL
  • PostgreSQL
  • SQLite
  • SQL Server

同时也可以自定义其他数据库驱动,这都是支持的.

对表结构的更多操作

  • 创建一张表
  • 判断数据表是否存在
  • 删除一张表
  • 重命名一张表
  • 修改表结构注释
  • 修改主键字段

对表column的操作

  • 支持全面的列类型(并且自动处理不同数据库的兼容)
  • 支持全面的列属性,比如limit,default,length(并且自动兼容数据库)
  • 获取当前表结构的所有列
  • 通过列的名称获取他的属性信息
  • 判断列是否存在
  • 修改列名称
  • 设置列在表结构的位置
  • 删除列
  • 设置索引
  • 设置外键

phinx还有其他我们会在开发中用到的特性功能,比如数据初始化,数据的操作,配置和模板.

如果你的产品需要分发安装,如果你的产品需要一个可靠的数据库设计改动升级解决方案,phinx就是你正在找的答案.

 类似资料: