158 lines
3.2 KiB
JavaScript
158 lines
3.2 KiB
JavaScript
|
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;
|