我應該手動修改線上資料庫的資料嗎?

chowjiawei發表於2022-04-08

應用版本指令碼升級的意義

升級命令的意義在於,應用升級迭代的時候時,

  • 需要對資料庫的內容進行檢查是否符合下個版本的使用,防止應用由於更新了版本 導致某個功能不可用或者異常。
  • 由於之前的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 協議》,轉載必須註明作者和本文連結

相關文章