【问题标题】:IN Lookup Postgres query in prepared statement, Golang在准备好的语句中查找 Postgres 查询,Golang
【发布时间】:2020-05-15 15:00:27
【问题描述】:

用例需要运行排除查询。 比如:

select col1 
from awesome_table 
where col2 not in (a,b,c,d) 
and col3 not in (a1,a2,a3,a4);

由于排除 col1 值和排除 col2 值的集合是可变大小的,有什么好的方法来生成准备好的语句? 我能想到的一个技巧是在集合上定义一个上限,比如 15,如果用户输入的查询集大小的数量小于最大值,则用重复值填充所有占位符,有没有更好的方法?根据社区的理念,准备好的陈述应该如何处理这个问题?

【问题讨论】:

标签: postgresql go prepared-statement


【解决方案1】:

你能从 Go 传递 (Postgres) 数组吗?

然后你可以将语句重写为

where col2 <> ALL ($1) 
  and col3 <> all ($2)

其中$1$2 是包含值的(Postgres)数组。

如果您无法传递正确的数组实例,您可以将值作为经过格式化的字符串传递,以便将其转换为数组。

select col1 
from awesome_table 
where col2 <> ALL ( (cast $1 as int[]) ) 
  and col3 <> ALL ( (cast $2 as text[]) );

然后您可以将'{1,2,3}' 传递给第一个参数,例如'{"foo", "bar"}' 作为第二个参数。您需要将数组类型调整为列的实际数据类型

【讨论】:

  • Go 结构有哪些特征可以作为 Postgres 数组?
  • @dbot_5:抱歉,不知道。我对 Go 及其驱动程序与 Postgres 的交互没有经验。但是第二种解决方案将始终有效,并且不会造成性能损失(与第一种相比)
【解决方案2】:

添加到@a_horse_with_no_name 的答案, 在 Golang 中,psql 驱动程序github.com/lib/pq 包含一个方法Array(),可用于将 Golang 切片转换为 psql 数组。

...

import (
"github.com/lib/pq"
)

...

select col1 
from awesome_table 
where col2 <> ALL ($1) 
  and col3 <> ALL ($2);


在哪里

slice1 := []string{val1, val2}
slice2 := []string{val3, val4}

pq.Array(slice1) 可以传递给$1pq.Array(slice2) 可以传递给$2 占位符,同时传递准备好的语句中的值。

更多关于ANYALL函数的信息可以在here找到

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多