我应该手动修改线上数据库的数据吗?

Laravel框架
399
0
0
2022-09-29

Artisan 应用版本脚本升级命令

应用版本脚本升级的意义

升级命令的意义在于,应用升级迭代的时候时,

  • 需要对数据库的内容进行检查是否符合下个版本的使用,防止应用由于更新了版本 导致某个功能不可用或者异常。
  • 由于之前的bug 导致了脏数据填入 换新功能 等数据库需要变动 预填充数据等 的任何操作。

人为去操作数据库是 很危险的,无论你涉及的数据重要性或多少

所以应该增加对升级版本的支持。该命令也需要有相对应的回滚,保证少数情况下异常升级导致的问题。

该命令 可以在使用docker等自动部署应用的时候 让系统自动为你执行(推荐)或者 每次升级的时候 手动执行

以下我列举一个简单的 例子 如果版本迭代众多 可以拆分到其余的子命令 也可以按照某个升级脚本中的某个模块来操作,自由发挥。

<?php

namespace App\Console\Commands\Upgrade;

use App\Models\Option;
use App\Models\Users\UserItems;
use Illuminate\Console\Command;
use Cache;
use Illuminate\Support\Facades\DB;

class UpgradeCommand extends Command
{

    /**
     * The name and signature of the console command.
     *
     * @var string
     */ 
    protected $signature = 'upgrade {version?}  {--rollback}';

    /**
     * The console command description.
     *
     * @var string
     */ 
    protected $description = '升级应用版本';

    /**
     * Create a new command instance.
     *
     * @return void
     */ 
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */ 
    public function handle()
    {
        $version = $this->argument('version');
        $rollback = $this->option('rollback');  //需要备份到文件并回滚  
        $message = '您的命令有误,目前支持v1.1.0 命令应如:php artisan upgrade v1.1.0 ';
        //判断当前版本,如果当前版本匹配则执行操作  
        if ($version == 'v1.1.0' && !$rollback) {
            $message = '本次升级了以下内容:1.删除user_items表内的chat_name数据 ';
            $this->output->progressStart(1);
//            $this->output->progressAdvance();


            //删除user_items表内的chat_name数据  
            $userItems=UserItems::query()->get();
            try {
                DB::beginTransaction();
                foreach ($userItems as $userItem) {
                    Option::set('upgrade_1.0.0_user_items_id_'.$userItem->id, $userItem->chat_name); //备份旧数据  
                    $userItem->chat_name=null;
                    $userItem->save();
                }
                DB::commit();
            } catch (\Exception $e) {
                DB::rollBack();
                $this->output->error('升级脚本遇到了问题 并全部回滚');
                return ;
            }

            $this->output->progressFinish();
        }

        if ($version == 'v1.1.0' && $rollback) {
            $message = '还原user_items表内的chat_name数据';
            $this->output->progressStart(1);

            //还原user_items表内的chat_name数据  
            $userItems=UserItems::query()->get();
            foreach ($userItems as $userItem) {
                if (Option::get('upgrade_1.0.0_user_items_id_'.$userItem->id)) {
                    $userItem->chat_name= Option::get('upgrade_1.0.0_user_items_id_'.$userItem->id);
                    Option::where('key', Option::get('upgrade_1.0.0_user_items_id_'.$userItem->id))->delete();
                    $userItem->save();
                }
            }
            $this->output->progressFinish();
        }

        $this->output->info($message);
    }
}

Artisan 应用版本脚本升级命令