【问题标题】:Using arrays with pg-promise使用带有 pg-promise 的数组
【发布时间】:2019-10-15 23:25:07
【问题描述】:

我正在使用 pg-promise,但不了解如何运行此查询。第一个查询有效,但我想使用 pg-promise 的安全字符转义,然后我尝试第二个查询它不起作用。

作品:

db.any(`SELECT title FROM books WHERE id = ANY ('{${ids}}') ORDER BY id`)

没用

db.any(`SELECT title FROM books WHERE id = ANY ($1) ORDER BY id`, ids)

【问题讨论】:

    标签: pg-promise


    【解决方案1】:

    这个例子有两个问题。首先,它违背了documentation tells you

    重要提示:永远不要在 ES6 模板字符串中使用保留的 ${} 语法,因为它们不知道如何为 PostgreSQL 格式化值。在 ES6 模板字符串中,您应该只使用以下 4 个选项之一 - $()$<>$[]$//

    手动查询格式化,就像您的第一个示例一样,是一种非常糟糕的做法,会导致坏事,从损坏的查询到 SQL 注入。

    第二个问题是,在切换到正确的 SQL 格式后,您应该使用CSV Filter 正确格式化值列表:

    db.any(`SELECT title FROM books WHERE id IN ($/ids:csv/) ORDER BY id`, {ids})
    

    或通过索引变量:

    db.any(`SELECT title FROM books WHERE id IN ($1:csv) ORDER BY id`, [ids])
    

    请注意,我还将操作数从 ANY 更改为 IN,因为我们在此处提供了开放值列表。

    您可以随意使用过滤器:list

    【讨论】:

    • 我收到以下错误:error: { error: invalid input syntax for integer: "1,2,3,4,5,6,7,8,9,10,11,12,...." 这是代码:db.any(SELECT * FROM objectives WHERE id IN ($1:csv) ORDER BY $2, [ids , order]) .then(function (data) { 这是控制台查询:db.any SELECT * FROM targets WHERE id IN ($1:csv) ORDER BY $2 [ '1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34', 'id' ]
    • @RonI Variable $1 期望值是一个数组,而不是字符串。而$2 应改为$2:name
    • 知道了!谢谢,我已将 ids 转换为字符串,因为我不正确地使用了 es6 字符串模板。非常感激! :)
    • 更新 - 它适用于具有值的数组,但对于空数组,我收到此错误:SELECT * FROM objects WHERE id IN ($1:list) ORDER BY $2:name [ [], ' id' ] 错误:{ 错误:“)”处或附近的语法错误
    猜你喜欢
    • 1970-01-01
    • 2020-06-12
    • 2015-11-23
    • 1970-01-01
    • 2017-11-18
    • 2017-06-07
    • 2016-10-31
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多