为啥要使用 migrate 迁移数据库,以及 PHP 中如何使用 migrate
2019-04-18| 程成| 1283| 1| PHP技术

网上有很多教程,教你如何使用 migrate。但是我们为什么要使用 migrate,我们要知其所以然。


一、我们为什么要使用 migrate


我们在开发过程中,使用到了很多的版本控制器,比如git,svn,cvs 等等,代码统一性得到了很好的保证。但是在多人开发中,我们的数据库却往往出一些问题,少一个字段,线上线下数据库不统一,我的数据库被别人覆盖了... 最关键的是还没有操作日志,也没有修改数据库的时间... 所以 migrate 就解决了这些问题。


migrate 可以让开发者简洁的修改和维护数据库。避免人为手写SQL语句,可以方便的进行不同数据库之间的迁移。还可以追踪到哪些迁移脚本被执行,开发者可以不用担心数据库的状态,从而更加关注如何编写更好的代码。



二、安装 migrate


这个是 github 地址:https://github.com/mattes/migrate


composer 一键安装


composer require robmorgan/phinx


这里不要把phinx包放到系统composer vendor文件夹里面,可以单独创建一个manage文件夹,因为这部分可能是不需要发布打包的。



1、初始化 Phinx 配置文件


默认生成phinx.yaml配置文件,还支持phinx.json,phinx.php作为配置文件可以手动创建。


vendor/bin/phinx init




配置文件示例:


#db_config.php 这个部门共享当前系统数据库配置
<?php
$config = array(
    'DB_HOST' => 'localhost',
    'DB_NAME' => 'lleg',
    'DB_USER' => 'root',
    'DB_PWD' => '',
);
$settings = $config;
#phinx.php
<?php
require 'db_config.php';
return array(
    "paths" => array(
        "migrations"    => "db/migrations",
        "seeds"         => "db/seeds"
    ),
    "environments"   => array(
        "defaut_migration_table"    => "phinxlog",
        "default_database"          => "lleg",
        "default_environment"       => "development"
        "production"   => array(
            "adapter"   => "mysql",
            "host"      => $settings["DB_HOST"],
            "name"      => $settings["DB_NAME"],
            "user"      => $settings["DB_USER"],
            "pass"      => $settings["DB_PWD"],
            "port"      => 3306,
            "charset"   => "utf8"
        ),
        "development"   => array(
            "adapter"   => "mysql",
            "host"      => $settings["DB_HOST"],
            "name"      => $settings["DB_NAME"],
            "user"      => $settings["DB_USER"],
            "pass"      => $settings["DB_PWD"],
            "port"      => 3306,
            "charset"   => "utf8"
        )
    )
);



2、根据phinx配置路径创建migrations和seeds文件夹


migrations文件夹:


存放由create命令创建的迁移文件, 每个迁移脚本都是一个 PHP 类。首选使用 Phinx API 来写迁移脚本,但是纯 SQL 语句也是支持的。


seeds文件夹:


存放使用seed命令插入测试数据文件,Seed 类可以很方便的在数据库创建以后填充数据。




3、创建迁移脚本


create 命令用来创建迁移脚本文件。需要一个参数:脚本名。迁移脚本命名应该保持 驼峰命名法


迁移脚本是带时间标记的,migrate命令执行过后,将会记录在当前数据库phinxlog中,每个脚本只能执行一次。从而达到数据版本管理目的,实际上是吧数据操作转化成了一个按时间顺序存储的迁移文件,把这些迁移文件利用git管理自然就达到了数据库版本管理的目的。


$ vendor/bin/phinx create MyNewMigration


打开新创建的迁移脚本并编写数据库修改。Phinx 把迁移脚本创建到 phinx.yml

你可以重写模板文件,并在创建的时候指定模板


$ vendor/bin/phinx create MyNewMigration --template="<file>"



可以提供一个模板类,这个类必须继承接口 Phinx\Migration\CreationInterface


$ vendor/bin/phinx create MyNewMigration --class="<class>"



提供的模板中,类中也可以定义回调,这个回调将在迁移脚本生成的时候被调用


注意:你不能同时使用 --template 和 --class



迁移脚本示例:


<?php
use Phinx\Migration\AbstractMigration;
class CreateUserLoginsTable extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     * Uncomment this method if you would like to use it.
     */
    public function change()
    {
        // create the table
        $table = $this->table('user_logins');
        $table->addColumn('user_id', 'integer')
              ->addColumn('created', 'datetime')
              ->create();
    }
    /**
     * Migrate Up.
     */
    public function up()
    {
    }
    /**
     * Migrate Down.
     */
    public function down()
    {
    }
}



当执行这个迁移脚本,Phinx 将创建 user_logins 表,并且在回滚的时候自动删除该表。


注意,当 change 方法存在的时候,up 和 down 方法会被自动忽略。如果你想用这些方法建议你创建另外一个迁移脚本。其他更多操作请查看自己使用语言对应Migrate工具文档。



4、创建数据库 Seeding


支持数据库中使用seeding插入测试数据,Phinx 用下面命令创建一个新的 seed 类


$ php vendor/bin/phinx seed:create UserSeeder



如果你配置了多个seed路径,将会提示你选择seed放置目录

下面的Seed基于一个框架模板:


<?php
use Phinx\Seed\AbstractSeed;
class MyNewSeeder extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeders is available here:
     * http://docs.phinx.org/en/latest/seeding.html
     */
    public function run()
    {
    }
}


Run 方法将在 Phinx 执行 seed:run 时被自动调用。你可以将测试数据的插入写在里面。


不像数据库迁移,Phinx 并不记录 seed 是否执行过。这意味着 seeders 可以被重复执行,请在开发的时候记住。其他更多操作请查看自己使用语言对应Migrate工具文档。


回滚


php vendor/bin/phinx rollback


这里还有篇 Lravel 中数据迁移和数据填充详细步骤

https://www.jb51.net/article/129637.htm




×
作者:程成
QQ:492245711