Skip to main content

6.数据库编码规范

myddd-electron使用SQLite3数据库,为简化相关开发,封装了SQLite3规范,以便快速入手

申明表#

提供了一个ITable的接口,包含以下两个方法

import { Table } from './Table';
/** * 仓储接口协议 */export interface ITable {
    /**     * 创建表的语句     */    createTable():Table;
    /**     * 更新表的语句     * @param from 从哪个版本      * @param to 到哪个版本     */    updateTable(from:number,to:number):string[];}

需要建立的表,新建一个类,实现以上接口

参考. MessageTable.ts

export class MessageTable implements ITable{    public createTable(): Table {        const messageTable = new Table("message_") //表名        .addPrimaryColumn('deliveryId') //消息ID,主键        .addIndexColumn('sessionId') //会话ID,索引        .addIndexColumn('deliveryTime',ColumnType.Integer) //消息时间,索引         .addColumn('messageType') //消息类型        .addColumn('fromId') //消息发送ID        .addColumn('fromDomain') //消息发送域        .addColumn('fromType',ColumnType.Integer) //发送者类型        .addColumn('toId') //接收ID        .addColumn('toDomain') //接收域        .addColumn('toType',ColumnType.Integer) //接收类型        .addColumn('metadata') //元数据,my_name,my_avatar类似        .addColumn('body'); //消息body中的数据        return messageTable;    }           public updateTable(from: number, to: number): string[] {        return [];    }  }

将表注册进数据库#

export class BaseRepository {
    private static DB_NAME = 'workplus.data';
    private static DB_VERSION = 1;
    private static instance:BaseRepository;
    private repository:Repository;
    private tables:ITable[] = [];
    private constructor(){        //添加会话表        this.tables.push(new SessionTable());        //添加消息表        this.tables.push(new MessageTable());                this.repository = new Repository(BaseRepository.DB_NAME,this.tables,BaseRepository.DB_VERSION);    }}

在BaseRepository中将表注册进去

建立模块仓储接口及实现#


export interface ISessionRepository {
    /**     * 获取到所有SESSIONS     */    listSessions():Promise<Session[]>;
    /**     * 新增或保存一个sesson     * @param session      */    save(session:Session):Promise<boolean>;
}
export class SessionRepository extends ISessionRepository {

    protected getRepository():IRepository{        return BaseRepository.getInstance().getRepository();    }

    static QUERY_ALL_SESSIONS:string = 'select s.*,se.value as sticky, m.deliveryTime as lastMessgeTimestamp ,m.sendStatus as lastMessageStatus,m.fromId as fromId,rm.lastDeliveryTime as lastDeliveryTime from session_ s left join message_ m  on s.lastMessageId  = m.deliveryId left join recipet_message_  rm on rm.sessionId  = s.identifier left join  setting_ se on se.type == 0 and se.key = s.identifier ORDER  by m.deliveryTime desc'     /**     * 删除一个会话     * @param sessionId      */    public async  deleteSession(sessionId:string):Promise<boolean>{        const deleteSQL = "delete from session_ where identifier = $sessionId";        return await this.getRepository().executeUpdate(deleteSQL,{            $sessionId:sessionId        });    }
    private instanceFromDB(result:ISession):Session{        return new Session(result);    }
}

封装的接口及API说明#

相关接口封装仍在完善中

export interface IRepository {
    /**     * 执行一条查询,返回数组或空     * @param sql      * @param params      */    executeQuery<T>(sql:string,params:any):Promise<T[] | null >;
      /**     * 执行一条查询,返回单个对像或空     * @param sql      * @param params      */    executeSingleQuery<T>(sql:string,params:any):Promise<T | null >;
    /**     * 执行一条数据库更新操作,返回是否执行成功     * @param sql      * @param params      */    executeUpdate(sql:string,params:any):Promise<boolean>;
    /**     * 执行一个事务内的批量数据库操作     * @param sqls 批量执行的数组     * @param params 批量参数组     */    executeBatchUpdate(sqls:string[],params:any[]):Promise<boolean>;}