【问题标题】:Parameterising `LIMIT ALL` in pg-promise在 pg-promise 中参数化 `LIMIT ALL`
【发布时间】:2020-03-20 14:57:52
【问题描述】:

我有一个简单的查询:

SELECT * FROM table ORDER BY ${pageSortKey:name} ${pageSortDir:raw} LIMIT ${pageLimit} OFFSET ${pageOffset}

如何将ALL 传递给LIMIT

据我了解 - ${pageLimit} 被视为 int,因此如果我尝试将参数 'ALL' 传递给它,我得到:

"bigint 类型的输入语法无效:\"ALL\""

非常感谢阅读。

【问题讨论】:

  • As far as I understand it - ${pageLimit} is treated as an int - 这是什么意思?它接受您传入的任何内容。您可以将其更改为${pageLimit:raw},然后您也可以传入ALL,或者您可以通过Custom Type Formatting 创建自定义类型。

标签: pg-promise


【解决方案1】:

最简单的就是直接使用这个值,把变量改成${pageLimit:raw}

更安全的方法是为它创建自己的自定义类型,使用Custom Type Formatting

const limit = val => ({rawType: true, toPostgres: () => val ?? 'ALL'});

然后将函数结果作为值传递给查询,会产生:

  • limit(0) => 0
  • limit(123) => 123
  • limit() => ALL
  • limit(null) => ALL

第二种方法更好,但通常,您会选择将整个LIMIT 逻辑包装到其中,而不仅仅是限制值:

const limit = val => ({ rawType: true, toPostgres: () => val ? `LIMIT ${val}` : '' });

仅在要应用实际限制时生成整个LIMIT 子句:

  • limit(0) => ``
  • limit() => ``
  • limit(null) => ``
  • limit(123) => LIMIT 123

示例:

db.any('SELECT * FROM table $1', [limit(123)]);
//=> SELECT * FROM table LIMIT 123

db.any('SELECT * FROM table ${limit}', {limit: limit(123)});
//=> SELECT * FROM table LIMIT 123

【讨论】:

  • 你好 - 感谢你的回答,我认为自定义类型格式是我正在寻找的,顺便说一句 - 我一直很喜欢使用你的库:它真的很有用。
猜你喜欢
  • 2017-04-17
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多