Node.js封装一个简单的PostgresSQL操作类

时间:09/27/2024 16:30:15   作者:ChenReal    阅读:4

项目需要用Node.js去查询访问PostgresSQL数据库。一时间不到趁手的ORM,干脆自己封装一个吧。主打的是简洁轻量易上手。不废话,直接上代码:

安装pg库

npm install --save pg

创建数据库连接池

const pg = require('pg');

const pool = new pg.Pool({
    user: process.env.PG_USER,
    host: process.env.PG_HOST,
    database: process.env.PG_DBNAME,
    password: process.env.PG_PASSWD,
    port: process.env.PG_PORT,

    max: 20, // 连接最大连接数
    idleTimeoutMillis: 15000 // 连接最大空闲时间
});

封装PgDatabase

module.exports = class PgDatabase {
    client;
    constructor(){
        this.init();
    }

    async init(){        
        this.client = await pool.connect();
    }

    async queryBySql(sql){
        return await this.client.query(sql);
    }

    async update(table,data,where){
        var setSql = getSetSql(data);
        var whereSql = getWhereSql(where);
        var sql = `UPDATE "${table}" SET ${setSql}${whereSql};`;
        var result = await this.queryBySql(sql);
        return result.rowCount;
    }

    async delete(table,where){
        var whereSql = getWhereSql(where);
        var sql = `DELETE FROM "${table}"${whereSql};`;
        var result = await this.queryBySql(sql);
        return result.rowCount;
    }

    async insert(table,data){
        data = data || {};
        var keys = Object.keys(data);
        var values = keys.map(key => {
            return `'${data[key]}'`;
        });
        if(values.length == 0){
            return 0;
        }
        var fields = keys.join(" , ");
        var sql = `INSERT INTO "${table}" (${fields}) VALUES (${values.join(" , ")})`;
        var result = await this.queryBySql(sql);
        return result.rowCount;
    }

    async findCount(table,where){
        where =getWhereSql(where);
        var sql = `SELECT COUNT(1) AS total FROM "${table}"${where};`;
        var res = await this.queryBySql(sql);
        if(res.rowCount>0) return res.rows[0].total * 1;
        return 0;
    }

    async findOne(table,where,orderby){
        orderby = getOrderBySql(orderby);
        where =getWhereSql(where);
        var sql = `SELECT * FROM "${table}"${where}`;
        var res = await this.queryBySql(`${sql}${orderby} LIMIT 1;`);        
        if(res.rowCount>0) return res.rows[0];
        return null;
    }

    async findList(table,where,orderby,limit,offset){
        orderby = getOrderBySql(orderby);
        var sql = "SELECT * FROM \""+table+"\"" + getWhereSql(where);
        sql = `${sql} ${orderby}`;
        if(limit){
            sql += ` LIMIT ${limit}`;
        }
        if(offset){
            sql += ` OFFSET ${offset}`;
        }
        return await this.queryBySql(sql);
    }
}

公共函数

/**
* 将对象转为KeyValue数组
* @param {*} obj
* @returns
*/
const mapAsArray=(obj)=>{
    var result = [];
    obj = obj || {};
    for (const key in obj) {
        if (Object.hasOwnProperty.call(obj, key)) {
            const val = obj[key];
            result.push(`"${key}"='${val}'`);
        }
    }
    return result;
}

const getWhereSql = (data) => {
    if(data && typeof data === "string"){
        return " WHERE " + data;
    }
    let arr = mapAsArray(data);
    if(arr.length > 0){
        return " WHERE " + arr.join(" AND ");
    }
    return "";
}

const getSetSql = (data) => {
    if(data && typeof data === "string"){
        return data;
    }
    let arr = mapAsArray(data);
    if(arr.length > 0){
        return arr.join(" , ");
    }
    return "";
}

const getOrderBySql = (data) => {
    if(data){
        return " ORDER BY " + data;
    }
    return "";
}

应用示例

const PgDatabase = require('../db/pgdatabase');
// 实例化
const db = new PgDatabase();

const tableName = "table_users";
// 查找对象
var name = "username";
let user = await pg.findOne(tableName, {name:name});

// 查找列表
var where = {status:1};
let result = await pg.findList(tableName,where);
if(result.rowCount>0){
    console.log(result.rows);
}

// 统计行数
where = "status > 1";
let count = await pg.findCount(tableName,where);
console.log('count',count);

// 添加记录
await db.insert(tableName,{
    name: "foobar",
    password:"12345",
    phone: "12345",
    email: "foobar@example.com",
    status: 1
});

// 添加记录
where = {id:1};
await db.update(tableName,{
    password:"123456",
    status: 0
},where);

// 删除记录
where = {id:1};
await db.update(tableName,where);

 

评论
0/200