feat: 添加数据库同步功能,创建版本表并处理版本迁移

This commit is contained in:
2026-03-30 02:30:58 +08:00
parent 50efd0ea41
commit d9442b9875
9 changed files with 3779 additions and 48 deletions

60
src/db/sync.ts Normal file
View File

@@ -0,0 +1,60 @@
import { drizzle } from 'drizzle-orm/node-postgres';
import { sql } from 'drizzle-orm';
import { execSync } from 'child_process';
import { config } from '../modules/config.ts';
const VERSION_TABLE = '__db_version';
const CURRENT_VERSION = '0.1.0';
function getDb() {
return drizzle(config.DATABASE_URL || '');
}
export async function syncDatabase() {
const database = getDb();
try {
// 1. 确保版本表存在
await database.execute(sql`
CREATE TABLE IF NOT EXISTS ${VERSION_TABLE} (
id SERIAL PRIMARY KEY,
version VARCHAR(255) NOT NULL,
applied_at TIMESTAMP DEFAULT NOW()
)
`);
// 2. 获取当前数据库版本
const result = await database.execute(sql`
SELECT version FROM ${VERSION_TABLE} ORDER BY id DESC LIMIT 1
`);
const dbVersion = result.rows[0]?.version;
// 3. 版本对比
if (dbVersion === CURRENT_VERSION) {
console.log('[DB Sync] Version up to date:', CURRENT_VERSION);
return;
}
console.log(`[DB Sync] Version mismatch: DB=${dbVersion}, Code=${CURRENT_VERSION}`);
console.log('[DB Sync] Running drizzle-kit push...');
// 4. 执行 drizzle-kit push
execSync('npx drizzle-kit push --force', {
cwd: process.cwd(),
stdio: 'inherit',
env: { ...process.env, DATABASE_URL: config.DATABASE_URL },
});
// 5. 更新版本记录
await database.execute(sql`
INSERT INTO ${VERSION_TABLE} (version) VALUES (${CURRENT_VERSION})
`);
console.log('[DB Sync] Migration completed, version updated to:', CURRENT_VERSION);
} catch (error) {
console.error('[DB Sync] Migration failed:', error);
throw error;
}
}
export const sync = syncDatabase;