繁体   English   中英

我如何从 Golang 中的 Postgres 数组中获取切片?

[英]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}

idcodes都是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM