上萬條甚至上百萬資料進行遷出做備份或者進行不妨礙原系統資料的操作,現在很多企業都會用到,目前就需要將上百萬條資料進行遷出到副表儲存並操作,直接再後臺寫一個按鈕進行操作,既方便操作也不會很慢。畢竟是客戶需要,不能每次遷出都要客戶去資料庫操作,操作的不好那資料危險度挺高的。
1、分頁查詢資料庫主表資料
2、分頁寫入資料庫副表
兩句話很簡單,關鍵在於那個“分頁”式操作,那這就開始我這上百萬條的資料遷出作業 by user 悅悅 https://www.cnblogs.com/nuanai
前端肯定需要一個頁面來顯示這個操作按鈕,html的頁面佈局不做多餘解釋(使用的框架是fastadmin)頁面顯示了執行到的每一頁資料和執行結束後總頁數
1 <p>當前頁碼:<span id="currentPage"></span></p> 2 <p>總頁數:<span id="totalPage"></span></p> 3 4 <button type="button" id="qrBtntwo">遷出資料</button>
再來就是JS邏輯問題,html給這個按鈕起了一個名字,那就對這個名字進行單擊事件的觸發 by user 悅悅 https://www.cnblogs.com/nuanai
需要注意的是我這邊呼叫匯入資料方法,使用的Controller呼叫方法,因為我使用的是fastadmin框架,正常根據自己所使用的的框架進行方法的呼叫就可以。
1 $(document).on("click", "#qrBtntwo", function () { 2 // 初始化頁碼和總頁數 3 $('#currentPage').text(1); 4 $('#totalPage').text('正在匯入...'); 5 6 // 開始匯入資料,預設是第一頁 7 Controller.importProewm(1); 8 });
資料匯入方法的編寫,用到了ajax方法,也不過多解釋,正常的結構傳值,只要url路徑寫對即可(如果需要判定時間性操作,可以追加上時間點的判斷和傳值data),注意需要用到get傳值當前頁數page,因為下面返回需要繼續呼叫
1 importProewm:function(page){ 2 $.ajax({ 3 url: 'bwqr/Workflowhis/importproewm?page=' + page, 4 type: 'POST', 5 dataType: 'json', 6 success: function(res) {20 }, 21 error: function(xhr, status, error) { 22 // 顯示錯誤資訊 23 alert('資料匯入失敗:' + error); 24 } 25 }); 26 },
對於控制器的內容,就是每次讀取資料庫資料,按照分頁進行讀取後寫入到副表中,然後將“頁數”和"總頁數"結果返回到JS中,裡面使用到了事務的開啟,如果出現錯誤可以很好的判斷是哪一頁出現了錯誤 by user 悅悅 https://www.cnblogs.com/nuanai
1 public function importproewm(){ 2 3 // 每頁顯示的資料量 4 $pageSize = 10; 5 // 獲取當前頁碼 6 $page = isset($_GET['page']) ? intval($_GET['page']) : 1; 7 // 查詢原始表的資料總數 8 $query = Db::name('procedure'); 9 $total = $query->count(); 10 // 計算總頁數 11 $totalPage = ceil($total / $pageSize); 12 // 開啟事務 13 Db::startTrans(); 14 try { 15 // 查詢當前頁的資料並插入到目標表 16 $data = $query->where(["deletetime"=>null,"status"=>'normal'])->limit($pageSize)->page($page)->select(); 17 Db::name('procedure_his')->insertAll($data, true);//相同id的跳過 18 19 // 構建返回的JSON資料 20 $responseData = [ 21 'currentPage' => $page, 22 'totalPage' => $totalPage 23 ]; 24 // 提交事務 25 Db::commit(); 26 } catch (\Exception $e) { 27 // 回滾事務 28 Db::rollback(); 29 $this->error($e->getMessage()); 30 // 返回錯誤資訊 31 header('HTTP/1.1 500 Internal Server Error'); 32 echo '資料匯入失敗:' . $e->getMessage(); 33 } 34 35 $this->success('', null, $responseData); 36 }
JS迴圈呼叫importProewm方法即可:如果按照頁數進行迴圈,就需要傳入每一頁的頁數值,因此自己呼叫自己的時,需要傳入頁數值+1才可以實現頁數迴圈;裡面也進行了頁數判斷,如果沒有了下一頁,就會輸出完成提示
1 var response = res.data; 2 console.log(response); 3 // 更新當前頁碼和總頁數 4 $('#currentPage').text(response.currentPage); 5 $('#totalPage').text(response.totalPage); 6 7 // 判斷是否還有下一頁資料 8 if (response.currentPage < response.totalPage) { 9 // 繼續匯入下一頁資料 10 Controller.importProewm(response.currentPage + 1); 11 } else { 12 // 匯入完成 13 $('#totalPage').text(response.totalPage + ' (匯入完成)'); 14 }
至此,從主表遷出到副表功能就結束了,總結其實就是合理對自己的呼叫。 by user 悅悅 https://www.cnblogs.com/nuanai
如果大家有更簡單的主副表遷移 ,可以一起溝通。