注意:本文档只适合于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>;
**
* 设置一个键的过期时间
* @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,
}>;
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>;
/**
* 执行一条SQL语句
* @param sql SQL,可以使用?占位参数
* @param params 参数列表,一个数组,需要和sql中的参数占位保持一致
*/
excute(sql: string, params?: any[]): Promise<IDataBaseResponseType>;
/**
* 执行一条SQL语句
* @param sql SQL,可以使用?占位参数
* @param params 参数列表,一个数组,需要和sql中的参数占位保持一致
*/
excute(sql: string, params?: {
name: string,
type: typeof TYPES,
value: any,
}[] | (string | Date | number)[]): Promise<IDataBaseResponseType>;
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 ======================================================= //
}
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 ======================================================= //
}
- 代码重构
- Redis增加锁获取编号功能
- 增加Redis的支持