gpt4 book ai didi

postgresql - Golang 将一片结构作为用户定义类型的数组传递给存储过程

转载 作者:行者123 更新时间:2023-12-04 07:27:18 32 4
gpt4 key购买 nike

我有一部分结构想传递给存储过程以用作用户定义类型 t 的数组,但我想不出在 Go 中执行此操作的方法。

例如go中的结构体:

type a struct {
ID int `db:"id"`
Name string `db:"name"`
Created time.Time `db:"created"`
IsNew bool `db:"is_new"`
}

以及用户定义类型的创建语句

CREATE TYPE custom_type AS
(
id int,
name varchar,
created timestamp,
is_new boolean
)

然后是存储过程

create or replace procedure custom_procedure(
input custom_type[]
)

到目前为止我已经尝试过

func Save(records []a) error {
_, err := p.client.Exec("CALL custom_procedure($1)", pq.Array(records))
return err
}

但我只是得到一个错误“sql: converting argument $1 type: unsupported type a, a struct”

最佳答案

您必须实现 driver.Valuer a 类型上的接口(interface),并让 Value 方法返回 a 实例的 postgres 复合类型文字。

你可以阅读这个 documentation关于如何正确构造复合行类型值。请记住,由于您正在使用 pq.Array,它将引用 Value 方法的输出,您自己不应该在输出周围加上引号,并且你不应该使用 ROW 关键字。

例如:

type a struct {
ID int `db:"id"`
Name string `db:"name"`
Created time.Time `db:"created"`
IsNew bool `db:"is_new"`
}

func (v a) Value() (driver.Value, error) {
s := fmt.Sprintf("(%d,%q,%s,%t)",
v.ID,
v.Name,
v.Created.Format("2006-01-02 15:04:05"),
v.IsNew,
)
return []byte(s), nil
}

关于postgresql - Golang 将一片结构作为用户定义类型的数组传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68145980/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com