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

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 应用版本脚本升级命令

本作品采用《CC 协议》,转载必须注明作者和本文链接
chowjiawei
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 18
chowjiawei

这样子的标题才有助于有人进来 :see_no_evil:

2年前 评论
MArtian 2年前
chowjiawei (作者) (楼主) 2年前

我只能说, 我改线上库没有上亿数据 也有几千万数据了

2年前 评论
Smilephp (作者) 2年前
chowjiawei (楼主) 2年前
Complicated

看公司要求和项目的敏感度。简单的小项目,公司也不严格,我都是手动改了,快捷便利。要是公司有要求,那就按照要求来

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!