@hongfangze/database
TypeScript icon, indicating that this package has built-in type declarations

3.0.1 • Public • Published

@hongfangze/database 数据库操作类

介绍

注意:本文档只适合于v3.0.0及以后的版本,之前的版本函数定义不一致,无法兼容。

支持关系型数据库:Sqlite、Mysql、Postgresql、MicroSoft SQL Server(MSSQL),后期增加Oracle等

支持非关系型数据库:Redis,后期增加Mongo

开始使用

npm install @hongfangze/database

import { NoSQL, RDBMS } from'@hongfangze/database';
import { RedisOptions, MongoOptions, MysqlOptions, PostgresqlOptions, SqliteOptions } from'@hongfangze/database/OptionsDefine';

非关系型数据库公共函数


/**
     * 获取原生对象,注意:需要手动调用release函数释放连接
     * Redis:原生对象为ioredis,可用于一些特殊操作,如watch、multi、incr等
     * Mongo:原生对象为
     * @return {*}  {Promise<any>}
     * @memberof IBase
     */
    instance(): Promise<any>;

    /**
     * 关闭并释放数据库连接
     * @param {*} client 由instance函数获取的客户端
     * @return {*}  {Promise<void>}
     * @memberof IBase
     */
    release(client: any): Promise<void>;

    /**
     * 设置一个键
     * @param {string} key 键
     * @param {string} value 值
     * @param {number} ttl 有效期,单位:秒,Mongo暂不支持
     * @memberof IBase
     */
    set(key: string, value: string, ttl?: number): Promise<void>;

    /**
     * 获取键对应的值
     * @param {string} key
     * @return {*}  {Promise<string>}
     * @memberof IBase
     */
    get(key: string): Promise<string>;

    /** 
     * 判断键是否存在
     * @param {String} key 键
     * @returns Promise<boolean>
     * @memberof IBase
     */
    exists: (key: string) => Promise<boolean>;

    /** 
     * 删除一个键
     * @param {String} key 键
     * @memberof IBase
     */
    del: (key: string) => Promise<void>;

Redis特有函数

**
     * 设置一个键的过期时间
     * @param {String} key 键
     * @param {String} second 过期时间,单位秒,不传代表不过期
     * @memberof IRedis
     */
    expire: (key: string, second?: number) => Promise<void>;
    /**
    * 获取所有的(根据匹配规则)键
    * @param {String} pattern 规则。
    * * 匹配数据库中所有 key。
    * h?llo 匹配 hello , hallo 和 hxllo 等。
    * h*llo 匹配 hllo 和 heeeeello 等。
    * h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
    * @returns Promise<string[]>
     * @memberof IRedis
    */
    keys: (pattern?: string) => Promise<string[]>;
    /** 
     * 以秒为单位返回 键 的剩余生存时间 如果不存在 键 或者长期有效 返回-1
     * @param {String} key 键
     * @returns Promise<number>
     * @memberof IRedis
     */
    ttl: (key: string) => Promise<number>;
    /** 
     * 将一个或多个值 value 插入到列表 key 的表尾(最右边)。
     * @param {String} key 键
     * @param {String} value 值
     * @memberof IRedis
     */
    rpush: (key: string, value: string) => Promise<void>;
    /** 
     * 移除并返回列表 key 的头元素。
     * @param {String} key 键
     * @returns Promise<string>
     * @memberof IRedis
     */
    lpop: (key: string) => Promise<string>;
    /**
     * 获取一个自动流水号
     * @param business 业务或项目区分,防止不同业务或项目获取到的编号冲突
     * @param date 日期格式,如果不需要请传null
     * @param len 流水号的长度
     * @returns 
     */
    serialNumber: (business?: string, date?: "YYYY" | "YYYYMM" | "YYYYMMDD" | "YYYYMMDDHH" | "YYYYMMDDHHmm" | "YYYYMMDDHHmmss" | null, len?: number) => Promise<{
        date: string,
        number: number,
        serialNumber: string,
    }>;

Redis使用示例

    const redisConf: RedisOptions = {
        host: 'x.x.x.x',
        db: 0,
        password: 'password',
    };
    const Redis = new NoSQL(redisConf).Redis;
    console.log(`k1 set ${(await Redis.set('k1', 'v', 60))}`);
    console.log(`k1 get ${(await Redis.get('k1'))}`);
    console.log(`k1 esists ${(await Redis.exists('k1'))}`);
    console.log(`k1 del ${(await Redis.del('k1'))}`);
    console.log(`k1 esists ${(await Redis.exists('k1'))}`);
    console.log(`k2 set ${(await Redis.set('k2', 'v2', 60))}`);
    console.log(`k2 ttl ${(await Redis.ttl('k2'))}`);
    console.log(`k2 expire ${(await Redis.expire('k2', 120))}`);
    console.log(`k2 ttl ${(await Redis.ttl('k2'))}`);
    console.log(`k3 rpush1 ${(await Redis.rpush('k3', "k3-1"))}`);
    console.log(`k3 rpush2 ${(await Redis.rpush('k3', "k3-2"))}`);
    console.log(`k3 lpop1 ${(await Redis.lpop('k3'))}`);
    console.log(`k3 lpop2 ${(await Redis.lpop('k3'))}`);
    console.log(`k3 lpop3 ${(await Redis.lpop('k3'))}`);
    // 支持并发
    console.log(`serialNumber ${JSON.stringify(await Redis.serialNumber('ORDER', "YYYYMMDD", 3))}`);
    console.log(`serialNumber ${JSON.stringify(await Redis.serialNumber('ORDER', "YYYYMMDD", 6))}`);
    console.log(`serialNumber ${JSON.stringify(await Redis.serialNumber('ORDER', "YYYYMMDD"))}`);
    console.log(`serialNumber ${JSON.stringify(await Redis.serialNumber('ORDER', "YYYYMM", 3))}`);

    // 获取Redis(ioredis)原始对象,用于其他特殊操作(watch等)
    const redisClient = await Redis.instance();
    await redisClient.set("kk", "vv");
    await redisClient.expire("kk", 60);
    await Redis.release(redisClient);
    console.log(`keys ${(await Redis.keys('*'))}`);

关系型数据库公共函数

/**
     * 获取原生对象,注意:需要手动调用release函数释放连接
     * @return {*}  {Promise<any>}
     * @memberof IBase
     */
    instance(): Promise<any>;

    /**
     * 关闭并释放数据库连接
     * @param {*} client 由instance函数获取的客户端
     * @return {*}  {Promise<void>}
     * @memberof IBase
     */
    release(client: any): Promise<void>;

    /**
     * 开始一个事物,开始事物后,必须进行commit或rollback
     */
    beginTransaction(): Promise<void>;

    /**
     * 提交事物
     */
    commitTransaction(): Promise<void>;

    /**
     * 回滚事物
     */
    rollbackTransaction(): Promise<void>;

MySQL、PostgreSQL、Sqlite 运行T-SQL函数

/**
     * 执行一条SQL语句
     * @param sql SQL,可以使用?占位参数
     * @param params 参数列表,一个数组,需要和sql中的参数占位保持一致
     */
    excute(sql: string, params?: any[]): Promise<IDataBaseResponseType>;

MSSQL运行T-SQL特有函数

/**
     * 执行一条SQL语句
     * @param sql SQL,可以使用?占位参数
     * @param params 参数列表,一个数组,需要和sql中的参数占位保持一致
     */
    excute(sql: string, params?: {
        name: string,
        type: typeof TYPES,
        value: any,
    }[] | (string | Date | number)[]): Promise<IDataBaseResponseType>;

MySQL 使用示例(Postgresql、Sqlite使用类似,只是连接字符串和关键词转义符不同)

const mysqlConf: MysqlOptions = {
    host: 'x.x.x.x',
    database: "test",
    password: 'password',
};

export default async () => {
    // ========================================= MySQL ======================================================= //
    // 运行普通sql
    const mysql = new RDBMS(mysqlConf).MySQL;
    await mysql.beginTransaction();
    console.log("mysql insert", (await mysql.excute('insert into `user`(name,age)values(?,?);', ["张三", 30])));
    console.log("mysql select", (await mysql.excute('select * from user;')));
    await mysql.commitTransaction();
    // await mysql.rollbackTransaction();

    // 获取MySQL(mysql)原始对象,用于其他特殊操作
    // const client = await mysql.instance();
    // await client.query("");
    // await client.release(client);
    // ========================================= MySQL ======================================================= //
}

MSSQL使用示例,与MySQL的主要区别在于,T-SQL变量可能需要用户自己指定数据类型

const mssqlConf: MSSQLOptions = {
    server: 'x.x.x.x',
    database: "test",
    password: 'password',
};

export default async () => {
    // ========================================= MSSQL ======================================================= //
    // 运行普通sql
    const mssql = new RDBMS(mssqlConf).MSSQL;
    await mssql.beginTransaction();
    console.log("mssql insert", (await mssql.excute('insert into [user](name,age)values(?,?);', ["张三", 30])));
    console.log("mssql insert", (await mssql.excute('insert into [user](name,age)values(?,?);', [{
        name: "name",
        value: "李四",
        type: mssql.TYPES.VarChar(255),
    }, {
        name: "age",
        value: 20,
        type: mssql.TYPES.Int,
    }])));
    console.log("mssql select", (await mssql.excute('select * from [user];')));
    await mssql.commitTransaction();
    // await mssql.rollbackTransaction();

    // 获取MSSQL(mssql)原始对象,用于其他特殊操作
    // const mssqlClient = await mssql.instance();
    // await mssqlClient.query("");
    // await mssql.release(mssqlClient);
    // ========================================= MSSQL ======================================================= //
}

版本迭代记录

2024-05-18 v3.0.0

  • 代码重构

2024-04-15 v2.4.0

  • Redis增加锁获取编号功能

2024-03-14 v2.3.0

  • 增加Redis的支持

Readme

Keywords

none

Package Sidebar

Install

npm i @hongfangze/database

Weekly Downloads

10

Version

3.0.1

License

MIT

Unpacked Size

72.4 kB

Total Files

62

Last publish

Collaborators

  • hongfangze