Skip to content

Commit 609f15d

Browse files
committed
增加数据库备份功能
1 parent 25420b9 commit 609f15d

1 file changed

Lines changed: 52 additions & 3 deletions

File tree

backend/config/migrate.js

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,61 @@
1+
const { query, get, transaction } = require('./database');
2+
const fs = require('fs');
3+
const path = require('path');
4+
const { execSync } = require('child_process');
5+
16
/**
2-
* 数据库自动迁移与核查模块
3-
* 负责在系统启动时确保数据库健康,并在受保护的情况下修复结构
7+
* 创建数据库备份
48
*/
9+
async function createBackup() {
10+
const DB_TYPE = process.env.DB_TYPE || 'sqlite';
11+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
12+
const backupDir = path.resolve(process.cwd(), './data/backups');
513

6-
const { query, get, transaction } = require('./database');
14+
try {
15+
if (!fs.existsSync(backupDir)) {
16+
fs.mkdirSync(backupDir, { recursive: true });
17+
}
18+
19+
if (DB_TYPE === 'sqlite') {
20+
const dbPath = process.env.SQLITE_PATH || './data/carnote.db';
21+
const sourcePath = path.resolve(process.cwd(), dbPath);
22+
const backupPath = path.join(backupDir, `carnote_backup_${timestamp}.db`);
23+
24+
if (fs.existsSync(sourcePath)) {
25+
fs.copyFileSync(sourcePath, backupPath);
26+
console.log(`[备份] SQLite 数据库已备份至: ${backupPath}`);
27+
}
28+
} else if (DB_TYPE === 'postgresql') {
29+
const host = process.env.PG_HOST || 'localhost';
30+
const port = process.env.PG_PORT || 5432;
31+
const database = process.env.PG_DATABASE || 'carnote';
32+
const user = process.env.PG_USER || 'postgres';
33+
const password = process.env.PG_PASSWORD;
34+
35+
const backupPath = path.join(backupDir, `carnote_backup_${timestamp}.sql`);
36+
37+
// 构建 pg_dump 命令
38+
// 注意:这要求运行环境安装了 postgresql-client
39+
const env = { ...process.env, PGPASSWORD: password };
40+
try {
41+
execSync(`pg_dump -h ${host} -p ${port} -U ${user} -f "${backupPath}" ${database}`, { env });
42+
console.log(`[备份] PostgreSQL 数据库已备份至: ${backupPath}`);
43+
} catch (err) {
44+
console.warn(`[备份] PostgreSQL 自动备份失败 (可能未安装 pg_dump): ${err.message}`);
45+
// 仅警告,不中断启动
46+
}
47+
}
48+
} catch (error) {
49+
console.error(`[备份] 数据库备份过程中出错:`, error);
50+
}
51+
}
752

853
async function autoMigrate() {
954
console.log('开始检测数据库迁移...');
55+
56+
// 迁移前强制执行备份
57+
await createBackup();
58+
1059
const DB_TYPE = process.env.DB_TYPE || 'sqlite';
1160

1261
try {

0 commit comments

Comments
 (0)