Files
ai-showcase-platform/lib/database.ts

127 lines
3.3 KiB
TypeScript

// =====================================================
// 資料庫連接配置
// =====================================================
import mysql from 'mysql2/promise';
// 資料庫配置
const dbConfig = {
host: process.env.DB_HOST || 'mysql.theaken.com',
port: parseInt(process.env.DB_PORT || '33306'),
user: process.env.DB_USER || 'AI_Platform',
password: process.env.DB_PASSWORD || 'Aa123456',
database: process.env.DB_NAME || 'db_AI_Platform',
charset: 'utf8mb4',
timezone: '+08:00',
acquireTimeout: 60000,
timeout: 60000,
reconnect: true,
connectionLimit: 10,
queueLimit: 0,
};
// 創建連接池
const pool = mysql.createPool(dbConfig);
// 資料庫連接類
export class Database {
private static instance: Database;
private pool: mysql.Pool;
private constructor() {
this.pool = pool;
}
public static getInstance(): Database {
if (!Database.instance) {
Database.instance = new Database();
}
return Database.instance;
}
// 獲取連接
public async getConnection(): Promise<mysql.PoolConnection> {
return await this.pool.getConnection();
}
// 執行查詢
public async query<T = any>(sql: string, params?: any[]): Promise<T[]> {
const connection = await this.getConnection();
try {
const [rows] = await connection.execute(sql, params);
return rows as T[];
} finally {
connection.release();
}
}
// 執行單一查詢
public async queryOne<T = any>(sql: string, params?: any[]): Promise<T | null> {
const results = await this.query<T>(sql, params);
return results.length > 0 ? results[0] : null;
}
// 執行插入
public async insert(sql: string, params?: any[]): Promise<mysql.ResultSetHeader> {
const connection = await this.getConnection();
try {
const [result] = await connection.execute(sql, params);
return result as mysql.ResultSetHeader;
} finally {
connection.release();
}
}
// 執行更新
public async update(sql: string, params?: any[]): Promise<mysql.ResultSetHeader> {
const connection = await this.getConnection();
try {
const [result] = await connection.execute(sql, params);
return result as mysql.ResultSetHeader;
} finally {
connection.release();
}
}
// 執行刪除
public async delete(sql: string, params?: any[]): Promise<mysql.ResultSetHeader> {
const connection = await this.getConnection();
try {
const [result] = await connection.execute(sql, params);
return result as mysql.ResultSetHeader;
} finally {
connection.release();
}
}
// 開始事務
public async beginTransaction(): Promise<mysql.PoolConnection> {
const connection = await this.getConnection();
await connection.beginTransaction();
return connection;
}
// 提交事務
public async commit(connection: mysql.PoolConnection): Promise<void> {
await connection.commit();
connection.release();
}
// 回滾事務
public async rollback(connection: mysql.PoolConnection): Promise<void> {
await connection.rollback();
connection.release();
}
// 關閉連接池
public async close(): Promise<void> {
await this.pool.end();
}
}
// 導出單例實例
export const db = Database.getInstance();
// 導出類型
export type { PoolConnection } from 'mysql2/promise';