const sqlite3 = require('sqlite3').verbose(); const path = require('path'); const fs = require('fs'); class Database { constructor() { this.db = null; this.dbPath = process.env.DB_PATH || path.join(__dirname, '../database/chat.db'); } /** * 初始化数据库连接 */ async initialize() { try { // 确保数据库目录存在 const dbDir = path.dirname(this.dbPath); if (!fs.existsSync(dbDir)) { fs.mkdirSync(dbDir, { recursive: true }); } // 创建数据库连接 this.db = new sqlite3.Database(this.dbPath, (err) => { if (err) { console.error('数据库连接失败:', err.message); throw err; } console.log('SQLite数据库连接成功'); }); // 启用外键约束 await this.run('PRAGMA foreign_keys = ON'); // 初始化数据库表结构 await this.initializeTables(); return this.db; } catch (error) { console.error('数据库初始化失败:', error); throw error; } } /** * 初始化数据库表结构 */ async initializeTables() { try { const schemaPath = path.join(__dirname, '../database/schema.sql'); const schema = fs.readFileSync(schemaPath, 'utf8'); // 分割SQL语句并执行 const statements = schema.split(';').filter(stmt => stmt.trim()); for (const statement of statements) { if (statement.trim()) { await this.run(statement); } } console.log('数据库表结构初始化完成'); } catch (error) { console.error('数据库表结构初始化失败:', error); throw error; } } /** * 执行SQL语句 (INSERT, UPDATE, DELETE) */ run(sql, params = []) { return new Promise((resolve, reject) => { this.db.run(sql, params, function(err) { if (err) { reject(err); } else { resolve({ id: this.lastID, changes: this.changes }); } }); }); } /** * 查询单条记录 */ get(sql, params = []) { return new Promise((resolve, reject) => { this.db.get(sql, params, (err, row) => { if (err) { reject(err); } else { resolve(row); } }); }); } /** * 查询多条记录 */ all(sql, params = []) { return new Promise((resolve, reject) => { this.db.all(sql, params, (err, rows) => { if (err) { reject(err); } else { resolve(rows); } }); }); } /** * 开始事务 */ async beginTransaction() { await this.run('BEGIN TRANSACTION'); } /** * 提交事务 */ async commit() { await this.run('COMMIT'); } /** * 回滚事务 */ async rollback() { await this.run('ROLLBACK'); } /** * 关闭数据库连接 */ close() { return new Promise((resolve, reject) => { if (this.db) { this.db.close((err) => { if (err) { reject(err); } else { console.log('数据库连接已关闭'); resolve(); } }); } else { resolve(); } }); } } // 创建单例实例 const database = new Database(); module.exports = database;