go v1.18 gf v2.1.2
pgsql数据库的int8[]类型字段,gen dao后生成entity结构对应为[]int64 目前查询DB时数据转换没有问题(现有contrib已支持),但是在insert和update时,执行sql会报解析错误。
原因是slice类型的数据,会经过json.Marshal后再拼在sql中(code),但pgsql的int8[]类型字段,接受的是 {1,2,3} 大括号包着的数据,而json编码后是[1,2,3]中括号
暂时解决办法是自定义结构重写生成的entity中的[]int64类型字段,自定义结构实现driver.Valuer接口
@gqcn 帮忙看看框架是否能支持这个场景?
复现 pgsqlCREATE TABLE public.test_slice (
ids _int8 NULL
);
INSERT INTO public.test_slice (ids) VALUES ('{1,2}');
go
package main
import (
_ "github.com/gogf/gf/contrib/drivers/pgsql/v2"
_ "github.com/lib/pq"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/util/gutil"
)
type Result struct {
IDs []int64
}
func main() {
ctx := gctx.New()
var res Result
_ = g.DB().Model("test_slice").Ctx(ctx).Scan(&res)
gutil.DumpWithType(res)
data := Result{
IDs: []int64{3, 4},
}
if _, err := g.DB().Model("test_slice").Ctx(ctx).Insert(data); err != nil {
gutil.DumpWithType(err)
}
}
output
2022-08-01 17:55:27.296 [DEBU] {e04c685cf72f07178b559a6801f35276} [ 25 ms] [default] [rows:1 ] SELECT "ids" FROM "test_slice" LIMIT 1
main.Result(1) {
IDs: []int64(2) [
int64(1),
int64(2),
],
}
2022-08-01 17:55:27.325 [ERRO] {e04c685cf72f07178b559a6801f35276} [ 29 ms] [default] [rows:0 ] INSERT INTO "test_slice"("ids") VALUES('[3,4]')
Error: pq: malformed array literal: "[3,4]"