- DB 테이블명 변경 마이그레이션 스크립트 추가 (migrate_v5_rename_remote.js) - Backend (server.js): 쿼리 및 매핑 로직을 asset_remote 및 remotes 속성으로 업데이트 - Frontend (HWModal.ts): 폼 필드와 데이터 바인딩을 remotes로 일괄 수정 - 유틸리티 스크립트의 레퍼런스 일괄 업데이트
60 lines
1.7 KiB
JavaScript
60 lines
1.7 KiB
JavaScript
import mysql from 'mysql2/promise';
|
|
import dotenv from 'dotenv';
|
|
import * as xlsx from 'xlsx';
|
|
import fs from 'fs';
|
|
|
|
dotenv.config();
|
|
|
|
const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env;
|
|
|
|
async function backup() {
|
|
const connection = await mysql.createConnection({
|
|
host: DB_HOST,
|
|
user: DB_USER,
|
|
password: DB_PASS,
|
|
database: DB_NAME,
|
|
port: parseInt(DB_PORT || '3306')
|
|
});
|
|
|
|
console.log('🚀 Starting Database Backup Process...');
|
|
|
|
const tables = [
|
|
'asset_pc', 'asset_server', 'asset_storage', 'asset_remote',
|
|
'asset_equipment', 'asset_office_supplies', 'asset_survey', 'asset_vip'
|
|
];
|
|
|
|
const wb = xlsx.utils.book_new();
|
|
|
|
for (const table of tables) {
|
|
try {
|
|
// 1. Create table backup
|
|
await connection.query(`DROP TABLE IF EXISTS ${table}_backup`);
|
|
await connection.query(`CREATE TABLE ${table}_backup AS SELECT * FROM ${table}`);
|
|
console.log(`✅ Table backup created: ${table} -> ${table}_backup`);
|
|
|
|
// 2. Fetch data for Excel
|
|
const [rows] = await connection.query(`SELECT * FROM ${table}`);
|
|
if (rows.length > 0) {
|
|
const ws = xlsx.utils.json_to_sheet(rows);
|
|
// Sheet names max length is 31 chars
|
|
const sheetName = table.substring(0, 31);
|
|
xlsx.utils.book_append_sheet(wb, ws, sheetName);
|
|
}
|
|
} catch (e) {
|
|
console.warn(`⚠️ Skipped ${table}: ${e.message}`);
|
|
}
|
|
}
|
|
|
|
// 3. Write Excel file
|
|
const fileName = 'backupDB_20260608.xlsx';
|
|
xlsx.writeFile(wb, fileName);
|
|
console.log(`✅ Excel data exported successfully to ${fileName}`);
|
|
|
|
await connection.end();
|
|
}
|
|
|
|
backup().catch(err => {
|
|
console.error('❌ Backup Failed:', err);
|
|
process.exit(1);
|
|
});
|