API 文档暂时还没有,下面是使用的 demo
use node-postgres easier
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, });
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, });
const result = await pgHelper.delete({}, { tableName: 'jobs', transaction, });
const result = await pgHelper.update({ type: 'pravate', status: 'gg', }, { update: ['type', 'status'], tableName: 'jobs', returning: ['id'], transaction, });
const result = await pgHelper.select({ percentage: 0, }, { where: { percentage: '= {percentage}' or: { id: '=1', } }, schemaName: 'public', tableName: 'jobs', autoHump: false, count: true, });
await pgHelper.runSql('select now()'); // with params await pgHelper.runSql('select power({a}, {b})', { a: 2, b: 4 });
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(); }
PgHelper
Class
Boolean
- 如果autoHump
为true返回字段的名称会格式化为驼峰Boolean
- 如果returning
为true返回结果会包含更新、插入、修改的数据Object
- 替换默认的日志需要包含info
、error
两个函数Function
Array<Object>
- 插入表的数据,其中Object
的key需要和字段一一对应String
- 表名称String
- 表名称;default: public
Boolean|Array
- 如果returning
为true,返回结果会包含插入的数据,为数组时返回数组包含的字段same as pg.queries
Function
params Object
- 模版参数,其中Object
的key需要和SQL模版中{key}
值一一对应
options
options.tableNameString
- 表名称
options.schemaNameString
- 表名称;default: public
options.returning Boolean|Array
- 如果returning
为true,返回结果会包含删除的数据,为数组时返回数组包含的字段
options.whereObject
构建where sql
{ id: '>10', type: '={type}', or:{ id:'= any({ids})' } } // sql //where (id > 0 and type={type} or (id = any({ids} ) )
Function
params Object
- 模版参数,其中Object
的key需要和SQL模版中{key}
值一一对应
options
options.tableNameString
- 表名称
options.schemaNameString
- 表名称;default: public
options.returning Boolean|Array
- 如果returning
为true,返回结果会包含更新的数据,为数组时返回数组包含的字段
options.whereObject
构建where sql
{ id: '>10', type: '={type}', or:{ id:'= any({ids})' } } // sql //where (id > 0 and type={type} or (id = any({ids} ) )
options. updateArray|Object
- 需要更新的字段
['name', 'type'] // name = {name},type={type} OR { name: 'name', type: 'myType', } name = {name},type={myType}
same as pg.queries
Function
params Object
- 模版参数,其中Object
的key需要和SQL模版中{key}
值一一对应
options
options.tableNameString
- 表名称
options.schemaNameString
- 表名称;default: public
options.whereObject
构建where sql
{ id: '>10', type: '={type}', or:{ id:'= any({ids})' } } // sql //where (id > 0 and type={type} or (id = any({ids} ) )
options.limit int
- limit number
options.offset int
-offset number
options.count Boolean
-是否返回查询的行数
options.include array
- 返回的字段数组default*
options.order array
构建ordersql
['id', ['type', 'desc'], [''name'', 'asc']] // order by id, type desc, name asc
same as pg.queries
![]() | 1 bleepbloop 2021-02-23 11:53:25 +08:00 看了一下,好像不能防注入? |
![]() | 2 KouShuiYu OP @bleepbloop 可以防止注入 sql 中的{params}会被替换为$n 的形式 |
![]() | 3 KouShuiYu OP |
![]() | 4 KouShuiYu OP 官方提供的这种方式感觉太不好用了 ```js const query = { text: 'INSERT INTO users(name email) VALUES($1, $2)', values: ['brianc', '[email protected]'], } ``` 我改成了这种形式 ``` const query = { text: 'INSERT INTO users(name, email) VALUES({name}, {email})', values: { name: 'brianc', email: '[email protected]'] } `` |
![]() | 5 KouShuiYu OP 官方提供的这种方式感觉太不好用了 ```js const query = { text: 'INSERT INTO users(name, email) VALUES($1, $2)', values: ['brianc', '[email protected]'], } ``` 我改成了这种形式 ```js const query = { text: 'INSERT INTO users(name, email) VALUES({name}, {email})', values: { name: 'brianc', email: '[email protected]'] } ``` |
![]() | 6 KouShuiYu OP 额,好像不支持代码块 |
![]() | 7 fucUup 2021-02-23 12:39:42 +08:00 js 读写数据库????? 小心清库跑路 |
![]() | 9 fucUup 2021-02-23 12:48:21 +08:00 @KiseXu 跟语言无关, 我是吐槽你的交付物, 用起来很容易犯错的, 这样就不好, 一定要用核电站的思维写代码, 把容易犯错的设计砍掉 |
![]() | 10 fucUup 2021-02-23 12:49:53 +08:00 这种交付物, 接近裸写 sql, 不仅分库分表 一旦表动难维护, 还有容易清库跑路嫌疑 |
![]() | 11 RockShake 2021-02-23 13:04:00 +08:00 做小项目没问题的,楼主说了这是 ORM 的替代方案 |
12 0clickjacking0 2021-02-23 15:23:28 +08:00 orm 是真的可以杜绝 sql 注入的 |
![]() | 13 xieren58 2021-02-23 15:24:54 +08:00 knexjs 不好用吗? |
![]() | 14 KouShuiYu OP @xieren58 这个用起来比较简单,对照的是 https://github.com/felixfbecker/node-sql-template-strings,我又加上了方便单表 CURD 的四个方法 |
15 ERRASYNCTYPE 2021-02-24 11:11:05 +08:00 哈哈哈哈跟我自己做的一个好像,不过我用 gt gte lt lte 这些 mongodb 的保留词来做 where 构造 |
![]() | 16 KouShuiYu OP @ERRASYNCTYPE 考虑到 where 表达式情况太复杂了,还要额外加好多接口,所以就放开了 |
17 ERRASYNCTYPE 2021-02-24 11:40:07 +08:00 @KouShuiYu 确实,还有 or between 什么的要处理,所以我都是自己根据自己业务去个别调整来着,不完备 |
18 felixin 2021-02-24 11:40:54 +08:00 via Android 看一下 slonik |