import { CommonModel, NewCommonModel } from './CommonModel'; import { solveSqlPlaceholders, splicingSQL, SqlStatcParams } from './DBUtils' import { query, queryAndReturnInsertId } from './Query'; import { QueryGenerator } from './QueryGenerator'; /** * 数据库操作工具类 (SQLITE) * 如何使用: * DB.table('表名') 构造一个查询器 * DB.select/update/insert/delete 进行SQL查询,其中: * SQL中参数使用: {?} {参数索引} 来代表参数占位符,参数在args中传入 */ export class DB { /** * 构造查询器 * @param name 当前表名 * @returns 返回构造查询器 */ static table(name : string|NewCommonModel) { return new QueryGenerator(name); } /** * 进行 select 查询 * @param sql SQL语句 * @param args 参数数组 * @param staticParams 静态参数 * @returns promise 成功则返回查询到的数组,错误则返回错误信息 */ static async select(sql : string, args : unknown[], staticParams : SqlStatcParams = {}) { let placeholders = solveSqlPlaceholders(sql); let targetSql = splicingSQL(sql, placeholders, args, null, staticParams); return await query(targetSql); } /** * 执行 update 查询 * @param sql SQL语句 * @param args 参数数组 * @returns promise 成功则返回受影响的行数,错误则返回错误信息 */ static async update(sql : string, args : unknown[]) { let placeholders = solveSqlPlaceholders(sql); let targetSql = splicingSQL(sql, placeholders, args, null, {}); return await query(targetSql); } /** * 执行 insert 查询 * @param sql SQL语句 * @param args 参数数组 * @returns promise 成功则返回新插入的ID,错误则返回错误信息 */ static async insert(sql : string, args : unknown[]) { let placeholders = solveSqlPlaceholders(sql); let targetSql = splicingSQL(sql, placeholders, args, null, {}); return await queryAndReturnInsertId(targetSql); } /** * 执行 delete 查询 * @param sql SQL语句 * @param args 参数数组 * @returns promise 成功则返回受影响的行数,错误则返回错误信息 */ static async delete(sql : string, args : unknown[]) { let placeholders = solveSqlPlaceholders(sql); let targetSql = splicingSQL(sql, placeholders, args, null, {}); return await query(targetSql); } /** * 手动开始事务 */ static beginTransaction() { return this.actionSql('BEGIN'); } /** * 回滚事务 */ static rollBack() { return this.actionSql('ROLLBACK'); } /** * 提交事务 */ static commit() { return this.actionSql('COMMIT'); } /** * 异步执行sql * @param sql * @returns */ static async actionSql(sql : string) { return await query(sql); } }