这里是文章模块栏目内容页
依托Thinkphp框架实现APP数据表在线更新升级功能

依托Thinkphp框架实现APP数据表在线更新升级功能


在开发网站应用时,版本升级是必须具备的功能。对发行出去的版本实现自动化更新数据表信息,对应用的维护都具有实战意义。本文来实现此功能,相比Migrations这种数据表版本管理要简单很多;

首先新建一个Update.php控制器:

<?php 
namespace app\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\View;

class Update extends BaseController
{
 
    public function index( ){
        $request = $this->request;
        /**这里注意站点根目录是绑定到public */
        $version_file = BASE_ROOT ."/version.php";
        include  $version_file;
        $isupdate = 0;
        $request->version = $version; /*此变量在 version.php文件*/
        $update_file = BASE_ROOT ."/update.php";
        if(is_file($update_file)) {
            include $update_file;
        }       
        if($isupdate ==1){
            $text='<?php    $version = "'.$request->new_version.'" ;'; 
           
            file_put_contents($version_file , $text);
          
        }

        if($isupdate){
            return json(['message' => '升级成功']);
        }
        return json(['message' => '升级结束']);
    }
    
}

然后再Public目录下有两个文件:

update.php 和version.php文件,里面的代码:

update.php代码内容:

<?php
$new_version = '1.1.91';
/*当前站点版本$request->version 小于发行版本时开始运行下面代码 */
if (version_compare($request->version, $new_version, "<")) {
    $request->new_version = $new_version;
    /*=============把数据库更新写在这里================*/
    // 插入新表
    $add_table_sql = "CREATE TABLE IF `ims_cache` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `key` varchar(100) NOT NULL,
        `value` text NOT NULL,
        `expired_at` int(11) NOT NULL DEFAULT '0',
        PRIMARY KEY (`id`),
        UNIQUE KEY `key` (`key`)
      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;";

    if (!table_is_exist('ims_cache')) {
        \think\facade\Db::query($add_table_sql);
    }
    /**更新表字段 */
    if (!table_has_field('ims_cache', 'isused')) {
        \think\facade\Db::query("ALTER TABLE ims_cache ADD   isused  tinyint(1) COMMENT '是否再链接中'");
    }

    /*===============把数据库更新写在这里===========*/
    /*下面是固定返回*/
    $isupdate = 1;
}

version.php代码内容:

<?php    $version = "1.1.91" ;
/*当这个值比 update.php第一行 写的 版本值低的时候,会执行更新*/

然后再app/common.php 公共函数文件,添加两个函数:

function table_is_exist();

function table_has_field();

function table_is_exist($tablename) {
    $ret = \think\facade\Db::query("show tables   like '$tablename' ");
    if (empty($ret)) {
        return false;
    }
    return true;
}

function table_has_field($tablename, $fieldname) {
    $ret = \think\facade\Db::query("show full columns from $tablename ");
    if (empty($ret)) {
        return false;
    }
    $bool = false;
    foreach ($ret as $key => $val) {
        if ($val['Field'] == $fieldname) {
            $bool = true;
        }
    }
    return $bool;
}

实现的重点在public/ update.php内,它用来写数据表的变更情况;

插入新表 用 table_is_exist先判断,然后再执行插入;

更新表字段先table_has_field判断字段是否存在,再执行增加操作;


好了本文全部内容结束,感谢您的阅读,希望能帮助到您。