数据库迁移就像是数据库的版本控制,可以让团队轻松修改并共享应用程序的数据库结构。PHP Laravel 框架的 Artisan 命令行工具就有提供数据库迁移相关的命令。由于项目是基于 PHP Yaf 框架开发,所以,这里主要记录一下项目中所用到的另一款数据库迁移工具 - Phinx。
Phinx 主要有以下几个特性:在多种数据库间可移植。
独立于 PHP 框架。
简单的安装过程。
简单的命令行操作。
与其他各种 PHP 工具(Phing、PHPUnit)和 Web 框架集成。使用 Phinx rollback 命令回滚指定版本时一定要注意,rollback 将会执行指定版本之后的所有版本的向下迁移操作。(在生产环境中,建议不写或者注释 down 函数中的内容,确保不会因操作失误,导致生产环境中的数据库表及数据被破坏)
安装及初始化
使用 Composer 安装,如下:php composer.phar require robmorgan/phinx
创建迁移目录 db/migrations(确保目录具有读写权限):mkdir -p db/migrations
cd db/migrations
初始化 Phinx 并完成 phinx.yml 配置:vendor/bin/phinx init
编写迁移
运行以下命令,创建迁移文件:php vendor/bin/phinx create MyNewMigration
生成文件名格式为 YYYYMMDDHHMMSS_my_new_migration.php 的迁移文件,初始化文件内容为:<?php
use Phinx\Migration\AbstractMigration;
class MyNewMigration extends AbstractMigration
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
}
}
change 函数
Phinx 0.2.0 支持一个新特性,叫做可逆迁移。你只需要在 change 函数中编写向上迁移的逻辑,那么在执行向下迁移时,Phinx 会自动帮你处理。例如:<?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 表,当执行向下迁移(回滚)时,Phinx 会自动删除 user_logins 表。
注意,如果存在 change 函数,那么 up、down 函数会被忽略。
Phinx 只支持以下函数的可逆迁移:createTable
renameTable
addColumn
renameColumn
addIndex
addForeignKey
如果函数不支持可逆迁移,那么在执行向下迁移(回滚)时,Phinx 会抛出 IrreversibleMigrationException 异常。
up 函数
当执行 php vendor/bin/phinx migrate 命令时,如果 Phinx 检测到某个迁移文件还未执行过,那么就自动执行该迁移文件的 up() 函数。在该函数中,主要是编写想要对数据库做哪些修改。
down 函数
当执行 php vendor/bin/phinx rollback 命令时,如果 Phinx 检测到某个迁移文件已经执行过,那么就自动执行该迁移文件的 down() 函数。在该函数中,主要是编写想要对数据库做哪些还原(对应 down 函数中的修改)。
执行查询
可以使用 execute()、query() 函数执行原生 SQL 语句。其中 execute() 函数返回受影响的行数,query 函数返回 PDOStatement 对象结果集。在项目中,如果没有特定的需求,可以直接使用这种方式编写 up、down 函数,因为 Phinx 只支持通用所有数据库的列类型,对于 MySQL 特有的列类型,如:enum、set、blob、json 等,需要引入 MysqlAdapter 类。
参考资料