應用版本指令碼升級的意義
升級命令的意義在於,應用升級迭代的時候時,
- 需要對資料庫的內容進行檢查是否符合下個版本的使用,防止應用由於更新了版本 導致某個功能不可用或者異常。
- 由於之前的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);
}
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結