llm-chat/backend/models/database.js

158 lines
3.2 KiB
JavaScript
Raw Normal View History

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;