在我们分发安装我们的产品的时候,安装数据库是非常麻烦的,基本上你能做的就是导出一份数据库文件,然后封装一个一键安装数据库的功能.这还好,但是如果产品升级了,数据库有了改动,这时候处理起来就很麻烦了,既要兼容旧版本的数据,又要保持新的版本数据库完整.
不过不要怕,那是因为你不知道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就是你正在找的答案.