PHP技术栈

PHP构建表利器-Dbman

2017-05-12  本文已影响69人  你东哥呀

Dbman是一个可以让PHP开发者简单的修改和维护管理数据库表的小工具, 它避免了人为的手写 SQL语句,轻松的管理数据库迁移。

Dbman的代码结构如下: Paste_Image.png

  1. demo目录已经写好了两个demo文件。
  2. Dbman.php是Dbman的主代码文件,遵行PSR-4规范。
  3. config.php是Dbman的配置文件。
  4. dbman是可执行脚本文件,提供了6个方法。

开始使用Dbman

首先我们使用 php dbman , 效果如下图:

Paste_Image.png
  接下来我们使用 php dbman help,如下图: Paste_Image.png
  在配置好config.php的前提下,使用php dbman init创建系统管理表sys_schema_info,针对已经存在数据表的数据库,使用php dbman init --data初始化表信息,效果如下图: Paste_Image.png

接下来我们一个一个介绍其他方法的使用:
    php dbman update 添加和更新表字段,包括添加表、删除表。
    php dbman delete 删除表字段。
    php dbman maintain 等于update方法和delete方法。
    php dbman backups 备份数据表成php文件。

Dbman的设计理念很简单,一个文件就是一张表,文件名即表名。根据系统表sys_schema_info和INFORMATION_SCHEMA.TABLES表判断xxx.php文件即xxx表是否存在,既而断定是创建表,还是更新表。如果xxx表存在,就判断表文件的md5值和上个版本的md5值是否相同,既而断定是否更新表。Dbman为每个php表文件添加了一个版本号version,以version 等于 -1表示删除表。

下面我们使用Dbman创建一张demo表。

首先,创建一个demo.php文件,如下:

return array(
    'fields' => //数据库demo表的字段定义信息
        array(
            'id' => //id列的字段属性
                array(
                    'name' => 'id', //字段名
                    'type' => 'int(10)', //字段类型
                    'notnull' => false, //是否为空
                    'default' => NULL,  //默认值
                    'primary' => true,  //是否主键,是主键
                    'autoinc' => true,  //是否自增长,是自增长
                ),
            'uname' =>
                array(
                    'name' => 'uname',  //字段名
                    'type' => 'char(30)', //字段类型
                    'notnull' => false, //是否为空
                    'default' => NULL, //默认值
                    'primary' => false, //是否主键,不是主键
                    'autoinc' => false, //是否自增长,非自增长
                ),

        ),
    'index' => //数据库demo表的索引定义信息
        array(

        ),
    'version' => '1.0', //版本号,默认1.0
    'engine' => 'innodb', //存储引擎,默认innodb
    'comment' => 'demo表', //备注
);```
接着,我们执行命令: `` php dbman maintain``

![Paste_Image.png](https://img.haomeiwen.com/i5983766/a776d85cf9f3fc50.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后,我们查看数据库,会发现多了一张demo表,如下:

![Paste_Image.png](https://img.haomeiwen.com/i5983766/8b3a6f3cc72027f5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

到这里demo表就已经创建成功了,接着我们继续为它添加字段和索引 
```<?php
return array(
    'fields' => //数据库demo表的字段定义信息
        array(
            'id' => //id列的字段属性
                array(
                    'name' => 'id', //字段名
                    'type' => 'int(10)', //字段类型
                    'notnull' => false, //是否为空
                    'default' => NULL,  //默认值
                    'primary' => true,  //是否主键,是主键
                    'autoinc' => true,  //是否自增长,是自增长
                ),
            'uname' =>
                array(
                    'name' => 'uname',  //字段名
                    'type' => 'char(30)', //字段类型
                    'notnull' => false, //是否为空
                    'default' => NULL, //默认值
                    'primary' => false, //是否主键,不是主键
                    'autoinc' => false, //是否自增长,非自增长
                ),
            'password' =>
                array(
                    'name' => 'password',
                    'type' => 'char(32)',
                    'notnull' => false,
                    'default' => NULL,
                    'primary' => false,
                    'autoinc' => false,
                ),
            'start_status' =>
                array(
                    'name' => 'start_status',
                    'type' => 'enum(\'Y\',\'N\')',
                    'notnull' => false,
                    'default' => 'Y',
                    'primary' => false,
                    'autoinc' => false,
                ),
            'login_status' =>
                array(
                    'name' => 'login_status',
                    'type' => 'enum(\'Y\',\'N\')',
                    'notnull' => false,
                    'default' => 'N',
                    'primary' => false,
                    'autoinc' => false,
                ),

        ),
    'index' => //数据库demo表的索引定义信息
        array(
            'index_demo_uname'=>
                array(
                    //索引名
                    'name'=>'index_demo_uname',
                    //索引类型(normal 普通索引| unique 唯一索引| primary 主键索引)
                    'type' => 'unique',
                    //索引字段
                    'fields'=> 'uname',
                    //索引方法,默认空即可
                    'method'=>'',
                ),
            'index_demo_status'=>
                array(
                    //索引名
                    'name'=>'index_demo_status',
                    //索引类型(默认是: normal 普通索引)
                    'type' => '',
                    //索引字段(array 表示组合索引)
                    'fields'=> array(
                        'start_status',
                        'login_status',
                    ),
                    //索引方法,默认空即可
                    'method'=>'',
                ),
        ),
    'version' => '1.0', //版本号,默认1.0
    'engine' => 'innodb', //存储引擎,默认innodb
    'comment' => 'demo表', //备注
);```
再次,执行命令: `` php dbman maintain``
![Paste_Image.png](https://img.haomeiwen.com/i5983766/d39e12a14b72a691.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![Paste_Image.png](https://img.haomeiwen.com/i5983766/18d8799e491800be.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

可以出来,字段和索引都已经添加成功了。
  最后我们来看看删除字段,删除字段其实很容易,直接删除文件里的字段信息即可,如:删除``password``字段 :
```<?php
return array(
    'fields' => //数据库demo表的字段定义信息
        array(
            'id' => //id列的字段属性
                array(
                    'name' => 'id', //字段名
                    'type' => 'int(10)', //字段类型
                    'notnull' => false, //是否为空
                    'default' => NULL,  //默认值
                    'primary' => true,  //是否主键,是主键
                    'autoinc' => true,  //是否自增长,是自增长
                ),
            'uname' =>
                array(
                    'name' => 'uname',  //字段名
                    'type' => 'char(30)', //字段类型
                    'notnull' => false, //是否为空
                    'default' => NULL, //默认值
                    'primary' => false, //是否主键,不是主键
                    'autoinc' => false, //是否自增长,非自增长
                ),
            'start_status' =>
                array(
                    'name' => 'start_status',
                    'type' => 'enum(\'Y\',\'N\')',
                    'notnull' => false,
                    'default' => 'Y',
                    'primary' => false,
                    'autoinc' => false,
                ),
            'login_status' =>
                array(
                    'name' => 'login_status',
                    'type' => 'enum(\'Y\',\'N\')',
                    'notnull' => false,
                    'default' => 'N',
                    'primary' => false,
                    'autoinc' => false,
                ),

        ),
    'index' => //数据库demo表的索引定义信息
        array(
            'index_demo_uname'=>
                array(
                    //索引名
                    'name'=>'index_demo_uname',
                    //索引类型(normal 普通索引| unique 唯一索引| primary 主键索引)
                    'type' => 'unique',
                    //索引字段
                    'fields'=> 'uname',
                    //索引方法,默认空即可
                    'method'=>'',
                ),
            'index_demo_status'=>
                array(
                    //索引名
                    'name'=>'index_demo_status',
                    //索引类型(默认是: normal 普通索引)
                    'type' => '',
                    //索引字段(array 表示组合索引)
                    'fields'=> array(
                        'start_status',
                        'login_status',
                    ),
                    //索引方法,默认空即可
                    'method'=>'',
                ),
        ),
    'version' => '1.0', //版本号,默认1.0
    'engine' => 'innodb', //存储引擎,默认innodb
    'comment' => 'demo表', //备注
);```
再次,执行命令: `` php dbman maintain``
![Paste_Image.png](https://img.haomeiwen.com/i5983766/dff3db1f51ad3d38.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
于此``password``字段就已经成功删除了。
至于删除表,修改``version``号为``-1``即可,这里就不多演示了。

###如何在TP5中使用Dbman
首先,将代码放到``extend``目录,如下:
![Paste_Image.png](https://img.haomeiwen.com/i5983766/19c87de80847e2b3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
接着,在``tp5/application/command.php``文件里面添加以下两行:
'app\admin\command\dbman\Init',
'app\admin\command\dbman\Maintain',

最后,在``tp5/application/admin/command/dbman/``目录添加两个文件:

1.``tp5/application/admin/command/dbman/Maintain.php``

<?php
namespace app\admin\command\dbman;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use dbman\Dbman as BaseDb;
class Maintain extends Command
{
protected function configure()
{
$this->setName('Dbman:maintain')->setDescription('Update the database');
}

protected function execute(Input $input, Output $output)
{
    $sysObj = new BaseDb();
    $sysObj->maintain();
    $output->writeln("update complete!");
}

}

2.``tp5/application/admin/command/dbman/Init.php``

<?php
namespace app\admin\command\dbman;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use dbman\Dbman as BaseDb;
class Init extends Command
{
protected function configure()
{
$this->setName('Dbman:init')->setDescription('The system is initialized');
}

protected function execute(Input $input, Output $output)
{
    $sysObj = new BaseDb();
    $sysObj->init();
    $output->writeln("The initial complete!");
}

}

执行命令:`` php think ``

![Paste_Image.png](https://img.haomeiwen.com/i5983766/52d775accbcbfd0d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看到,我们已经在TP5中完美的融入了Dbman
上一篇下一篇

猜你喜欢

热点阅读