不喜欢使用 orm 框架,分享一个自己写 postgresql 的 sql 构造库

2021-02-23 11:49:40 +08:00
 KouShuiYu

GitHub 地址

API 文档暂时还没有,下面是使用的 demo

pg-helper

use node-postgres easier

Examples

const {PgHelper} = require('@c_kai/pg-helper');

// detail https://node-postgres.com/api/pool
const pgHelper = new PgHelper({
    host,
    user,
    password,
    database,
    port: 5432,
    max: 20,
    idleTimeoutMillis: 30000,
    connectionTimeoutMillis: 2000,
});

insert

const result = await pgHelper.insert([{
  percentage: 0,
  type: 'public',
  params: {},
  created_by: 1,
  status: 'created',
  job_uuid: '103',
},{
  percentage: 0,
  type: 'public',
  params: {},
  created_by: 1,
  status: 'created',
  job_uuid: '104',
}], {
  tableName: 'jobs',
  returning: true,
});

delete

const result = await pgHelper.delete({}, {
  tableName: 'jobs',
  transaction,
});

update

const result = await pgHelper.update({
  type: 'pravate',
  status: 'gg',
}, {
  update: ['type', 'status'],
  tableName: 'jobs',
  returning: ['id'],
  transaction,
});

select

const result = await pgHelper.select({
  percentage: 0,
}, {
  where: {
    percentage: '= {percentage}'
    or: {
      id: '=1',
    }
  },
  schemaName: 'public',
  tableName: 'jobs',
  autoHump: false,
  count: true,
});

Run sql

await pgHelper.runSql('select now()');

// with params
await pgHelper.runSql('select power({a}, {b})', { a: 2, b: 4 });

Run sql use transaction

await pgHelper.runTSql([
    {
        sql: 'select now()',
    },
    {
        sql: 'select power({a}, {b})',
        params: { a: 2, b: 4}
    }
])

OR

let transaction;
try {
  transaction = await pgHelper.getTransaction();
  let result4 = await pgHelper.runSql('select {str1} || {str2}', {
    str1: 'xiao',
    str2: 'hong',
  }, {
    transaction,
  });
  transaction.commit();

  console.log(result4)
} catch (error) {
  transaction.rollback();
}
2968 次点击
所在节点    Node.js
18 条回复
bleepbloop
2021-02-23 11:53:25 +08:00
看了一下,好像不能防注入?
KouShuiYu
2021-02-23 11:55:02 +08:00
@bleepbloop 可以防止注入 sql 中的{params}会被替换为$n 的形式
KouShuiYu
2021-02-23 11:56:07 +08:00
KouShuiYu
2021-02-23 11:58:44 +08:00
官方提供的这种方式感觉太不好用了
```js
const query = {
text: 'INSERT INTO users(name, email) VALUES($1, $2)',
values: ['brianc', 'brian.m.carlson@gmail.com'],
}

```

我改成了这种形式
```
const query = {
text: 'INSERT INTO users(name, email) VALUES({name}, {email})',
values: { name: 'brianc', email: 'brian.m.carlson@gmail.com']
}
``
KouShuiYu
2021-02-23 11:59:33 +08:00
官方提供的这种方式感觉太不好用了
```js
const query = {
text: 'INSERT INTO users(name, email) VALUES($1, $2)',
values: ['brianc', 'brian.m.carlson@gmail.com'],
}

```

我改成了这种形式
```js
const query = {
text: 'INSERT INTO users(name, email) VALUES({name}, {email})',
values: { name: 'brianc', email: 'brian.m.carlson@gmail.com']
}
```
KouShuiYu
2021-02-23 12:00:06 +08:00
额,好像不支持代码块
fucUup
2021-02-23 12:39:42 +08:00
js 读写数据库?????

小心清库跑路
KiseXu
2021-02-23 12:45:26 +08:00
@fucUup 这个节点是 Node.js
fucUup
2021-02-23 12:48:21 +08:00
@KiseXu 跟语言无关, 我是吐槽你的交付物, 用起来很容易犯错的, 这样就不好, 一定要用核电站的思维写代码, 把容易犯错的设计砍掉
fucUup
2021-02-23 12:49:53 +08:00
这种交付物, 接近裸写 sql, 不仅分库分表 一旦表动难维护, 还有容易清库跑路嫌疑
RockShake
2021-02-23 13:04:00 +08:00
做小项目没问题的,楼主说了这是 ORM 的替代方案
0clickjacking0
2021-02-23 15:23:28 +08:00
orm 是真的可以杜绝 sql 注入的
xieren58
2021-02-23 15:24:54 +08:00
knexjs 不好用吗?
KouShuiYu
2021-02-23 16:05:25 +08:00
@xieren58 这个用起来比较简单,对照的是 https://github.com/felixfbecker/node-sql-template-strings,我又加上了方便单表 CURD 的四个方法
ERRASYNCTYPE
2021-02-24 11:11:05 +08:00
哈哈哈哈跟我自己做的一个好像,不过我用 gt gte lt lte 这些 mongodb 的保留词来做 where 构造
KouShuiYu
2021-02-24 11:33:35 +08:00
@ERRASYNCTYPE 考虑到 where 表达式情况太复杂了,还要额外加好多接口,所以就放开了
ERRASYNCTYPE
2021-02-24 11:40:07 +08:00
@KouShuiYu 确实,还有 or between 什么的要处理,所以我都是自己根据自己业务去个别调整来着,不完备
felixin
2021-02-24 11:40:54 +08:00
看一下 slonik

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/755396

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX