Go语言中如何将自定义类型值传入pgx查询?
Go语言中如何将自定义类型值传入pgx查询?
你遇到的这个问题我太熟悉了——本质是pgx不知道该怎么把你的CustomData类型转换成数据库能识别的varchar格式,所以才会报找不到编码方案的错误。
先说说你尝试的pgtype.TextValuer为什么没生效:你给*CustomData指针类型实现了这个方法,但调用tx.Exec的时候传的是值类型d,Go的方法接收器是严格匹配的,pgx自然识别不到你写的转换逻辑。
给你两个靠谱的解决办法,选哪个都能搞定:
办法一:修正pgtype.TextValuer的接收器匹配问题
要么把方法的接收器改成值类型,这样不管传值还是传指针,pgx都能找到这个转换方法:
func (d CustomData) TextValue() (pgtype.Text, error) { return pgtype.Text{ String: d.data, Valid: true, }, nil }
要么就保持指针接收器,但调用的时候传指针过去:
_, err := tx.Exec(ctx, `INSERT INTO tab (data) VALUES ($1)`, &d)
办法二:实现标准库的driver.Valuer接口
这个方案更通用,毕竟标准库的接口几乎所有Go数据库驱动都支持,不用绑定pgx的特定类型:
import "database/sql/driver" type CustomData struct{ data string } func (d CustomData) Value() (driver.Value, error) { // 直接返回结构体里的字符串字段就行 return d.data, nil }
之后再像你原来那样传d进去,pgx会自动调用Value()方法,把你的自定义类型转成字符串传入SQL查询,编码错误自然就消失了。
备注:内容来源于stack exchange,提问作者Yura
相关产品推荐
相关产品推荐

