网上有很多教程,教你如何使用 migrate。但是我们为什么要使用 migrate,我们要知其所以然。
我们在开发过程中,使用到了很多的版本控制器,比如git,svn,cvs 等等,代码统一性得到了很好的保证。但是在多人开发中,我们的数据库却往往出一些问题,少一个字段,线上线下数据库不统一,我的数据库被别人覆盖了... 最关键的是还没有操作日志,也没有修改数据库的时间... 所以 migrate 就解决了这些问题。
migrate 可以让开发者简洁的修改和维护数据库。避免人为手写SQL语句,可以方便的进行不同数据库之间的迁移。还可以追踪到哪些迁移脚本被执行,开发者可以不用担心数据库的状态,从而更加关注如何编写更好的代码。
这个是 github 地址:https://github.com/mattes/migrate
composer 一键安装
composer require robmorgan/phinx
这里不要把phinx包放到系统composer vendor文件夹里面,可以单独创建一个manage文件夹,因为这部分可能是不需要发布打包的。
默认生成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" ) ) );
migrations文件夹:
存放由create命令创建的迁移文件, 每个迁移脚本都是一个 PHP 类。首选使用 Phinx API 来写迁移脚本,但是纯 SQL 语句也是支持的。
seeds文件夹:
存放使用seed命令插入测试数据文件,Seed 类可以很方便的在数据库创建以后填充数据。
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工具文档。
支持数据库中使用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