Golang将map[string]interface{}写入PostgreSQL jsonb字段报错求助
解决Golang中map[string]interface{}插入PostgreSQL jsonb列的类型不兼容问题
错误原因
Go的database/sql驱动(包括sqlx依赖的底层驱动)没法自动把map[string]interface{}转成PostgreSQL的jsonb类型,直接传map肯定报错。另外你原代码里newMap.properties是无效的Go语法,正确取map值应该用newMap["properties"],但就算修正这个,类型不兼容的核心问题还是存在。
解决方案
下面给两种可行的解决办法:
方法一:手动序列化为JSON字节数组
PostgreSQL的jsonb列支持直接接收JSON格式的字节流,用encoding/json包把map转成[]byte再传参数就行:
import ( "encoding/json" "context" ) func Insert(ctx context.Context) (id int64, err error) { propertiesMap := map[string]interface{}{ "response_status": 1, "reposne_message": "success", } // 将map序列化为JSON字节数组 jsonData, err := json.Marshal(propertiesMap) if err != nil { return 0, err } query := `INSERT INTO thisTable (properties) VALUES ($1) RETURNING this_table_id` err = sqlx.DB.QueryRowxContext(ctx, query, jsonData).Scan(&id) if err != nil { return 0, err } return id, nil }
方法二:用pgx驱动的JSONB类型
如果你的项目用pgx作为PostgreSQL驱动(sqlx能兼容pgx),可以直接用pgtype.JSONB类型包装map,驱动会自动处理类型转换:
import ( "context" "github.com/jackc/pgx/v5/pgtype" ) func Insert(ctx context.Context) (id int64, err error) { propertiesMap := map[string]interface{}{ "response_status": 1, "reposne_message": "success", } var jsonb pgtype.JSONB err = jsonb.Set(propertiesMap) if err != nil { return 0, err } query := `INSERT INTO thisTable (properties) VALUES ($1) RETURNING this_table_id` err = sqlx.DB.QueryRowxContext(ctx, query, jsonb).Scan(&id) if err != nil { return 0, err } return id, nil }
补充说明
你之前试的在SQL里写$1::jsonb没用,是因为驱动在把参数传给数据库之前就已经检测到类型不兼容报错了,根本没到数据库执行转换那一步,所以这种方法解决不了问题。
内容的提问来源于stack exchange,提问作者new line
相关产品推荐
相关产品推荐

