You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:28:05