[英]How do I get a slice from a Postgres array in Golang?
假设我有一个 postgres 查询,例如:
SELECT
id,
ARRAY_AGG(code) AS code
FROM
codes
WHERE id = '9252781'
GROUP BY id;
我的回报看起来像:
id | codes
-----------+-------------
9252781 | {H01,H02}
id
和codes
都是varchar
。
在 Golang 中,当我沿着行扫描我的结果时,它只是冻结。 没有错误,什么都没有。
如果您使用的是github.com/lib/pq
postgres驱动程序,则可以使用其pq.Array helper函数来扫描和存储postgres数组。
var id string
var arr []string
row := db.QueryRow(`SELECT '9252781', ARRAY['H01','H02']`)
if err := row.Scan(&id, pq.Array(&arr)); err != nil {
log.Fatal(err)
}
log.Println(id, arr)
// 9252781 [H01 H02]
我不想使用额外的驱动程序 ( github.com/lib/pq
),除了创建我自己的类型之外,我没有找到任何pgx
方法来做到这一点。
所以我做了一个:
type Tags []string
func (t *Tags) Scan(v interface{}) error {
if v == nil {
*t = Tags{}
return nil
}
s, ok := v.(string)
if !ok {
return fmt.Errorf("Scan is expected to receive a string from database, but got [%+v]", v)
}
s = strings.TrimPrefix(s, "{")
s = strings.TrimSuffix(s, "}")
*t = strings.Split(s, ",")
return nil
}
func (t *Tags) Value() (driver.Value, error) {
s := fmt.Sprintf("{%v}", strings.Join(([]string)(*t), ","))
return s, nil
}
然后您可以扫描从数据库返回的行,例如:
...
err := rows.Scan(
...
&Tags,
...
)
您可以直接在Exec
查询中使用它。
此代码适用于 arrays 中的常量,但如果想在逗号和括号中使用它,则需要做更多的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.