[gogf/gf]orm的bug

2024-06-25 208 views
9

我的model

type BingoCategory struct {
    Id        int    `orm:"id,primary"       json:"id"`          
    CateName  string `orm:"cate_name,unique" json:"cate_name"`   
    Slug      string `orm:"slug,unique"      json:"slug"`        
    Counts    int    `orm:"counts"           json:"counts"`      
    ParentId  int    `orm:"parent_id"        json:"parent_id"`   
    Intro     string `orm:"intro"            json:"intro"`       
    ListOrder int    `orm:"list_order"       json:"list_order"`  
    CreatedAt int64    `orm:"created_at"       json:"created_at"`
    UpdatedAt int64    `orm:"updated_at"       json:"updated_at"`
    Cover     string `orm:"cover"            json:"cover"`       
    Template  string `orm:"template"         json:"template"`    
    Status    int    `orm:"status"           json:"status"`      
}

其中Id为主键,CateName不允许重复 执行Update方法时生成的sql有问题

UPDATE `bingo_category` SET `created_at`=0,`updated_at`=1572961915,`cover`='',`template`='',`cate_name`='NewAbc',`slug`='new-adb',`counts`=0,`list_
order`=0,`status`=1,`id`=1,`parent_id`=0,`intro`='' WHERE cate_name='NewAbc'

会把cate_name作为更新的条件,我觉得是不是应该把id作为更新的条件呢? 经调试发现是gdb.GetWhereConditionOfStruct方法中的structs.TagMapField(pointer, []string{ORM_TAG_FOR_STRUCT}, true)影响SQL的生成结果,把true改成false就实现的预期目标

UPDATE `bingo_category` SET `template`='',`status`=1,`id`=1,`parent_id`=0,`intro`='',`cover`='',`created_at`=0,`updated_at`=1572962068,`cate_name`
='NewAbc',`slug`='new-adb',`counts`=0,`list_order`=0 WHERE id=1

回答

9

@arieslee gf-cli自动生成model中的方法将会被去掉,只会保留struct

3

@arieslee gf-cli自动生成model中的方法将会被去掉,只会保留struct

建议保留自动生成的方法,处理一下gdb.GetWhereConditionOfStruct中的逻辑,我觉得完全可以满足现有的需求~~

9

@arieslee 能够给完整的示例代码。

6

刚才我试了一下,我也复现不出来了! 我就记得当时看源码是因为 database/gdb/gdb_func.go

if len(array) > 1 && gstr.InArray([]string{ORM_TAG_FOR_UNIQUE, ORM_TAG_FOR_PRIMARY}, array[1]) 

这里面的逻辑,把ORM_TAG_FOR_UNIQUE去掉就好了,只把主键做为条件,唯一的不要

7

又出来了,看这个demo吧 https://github.com/arieslee/gf-demo gf version : v1.9.10

go env

sunmoon@sunmoons-mac:/Volumes/HDD/workshop/go/project/github.com/gf-demo$ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/sunmoon/Library/Caches/go-build"
GOENV="/Users/sunmoon/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=" -mod="
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/sunmoon/go"
GOPRIVATE=""
GOPROXY="https://goproxy.cn"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Volumes/HDD/workshop/go/project/github.com/gf-demo/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/m2/svy09trd2bjgzx0k0m_hnsy00000gn/T/go-build422856151=/tmp/go-build -gno-record-gcc-switches -fno-common"
2

@arieslee 请更新到最新的版本再试试。