npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

hongfangze-database

v4.0.0

Published

comm.database

Readme

数据库操作类

介绍

支持关系型数据库: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 ======================================================= //
}

版本迭代记录

2025-04-16 v4.0.0

  • 被移除后更名发布。

2025-03-25 v3.0.4

  • 修复MySQL的PROTOCOL_CONNECTION_LOST错误(使用连接池能很好的规避该异常)。
  • 使用新的打包方式发布。

2024-10-08 v3.0.2

  • RDBMS的execute拼写纠正。

2024-05-18 v3.0.1

  • 代码重构。

2024-04-15 v2.4.0

  • Redis增加锁获取编号功能(注意:Redis库数据丢失后,需要把当天的序列手动写入,否则会重新从1开始获取)。

2024-03-14 v2.3.0

  • 增加Redis的支持。