这似乎是一个常见问题,可能已经在某个地方发布了,但我找不到任何讨论它的线程,所以这里是问题:
我有一个存储 BYTEA
类型列的 Postgres 表.
CREATE TABLE foo (
id VARCHAR PRIMARY KEY,
json_data BYTEA
)
专栏
json_data
实际上只是 JSON 存储为 BYTEA
(我知道这并不理想)。它是非结构化的,但保证是 string -> string
JSON。查询这张表时,需要扫描查询
SELECT * FROM foo WHERE id = $1
进入以下结构:type JSONData map[string]string
type Foo struct {
ID string `db:"id"`
Data JSONData `db:"json_data"`
}
我正在使用 sqlx的
Get
方法。当我执行查询时,我收到错误消息 sql: Scan error on column index 1, name "json_data": unsupported Scan, storing driver.Value type []uint8 into type *foo.JSONData
.显然,扫描器在扫描 JSON
BYTEA
时遇到问题。成 map 。我可以实现自己的扫描仪并在 json_data
上调用我的自定义扫描仪列,但我想知道是否有更好的方法来做到这一点。我的 JSONData
类型实现现有接口(interface)自动执行此操作?
最佳答案
正如@iLoveReflection 所建议的,实现 Scanner *JSONData
上的界面工作。这是实际的实现:
func (j *JSONData) Scan(src interface{}) error {
b, ok := src.([]byte)
if !ok {
return errors.New("invalid data type")
}
return json.Unmarshal(b, j)
}
关于sql - 将非结构化 JSON BYTEA 扫描到 map[string]string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60496684/