[beego]beego1.12.3升级到beego2.0 orm 失败

2024-06-26 704 views
8
  1. Version of Go and beego bee2.0 go 1.15.2 beego2.0

  2. go env

    ➜  beego2 git:(update) ✗ go env
    GO111MODULE="on"
    GOARCH="amd64"
    GOBIN=""
    GOCACHE="/Users/c/Library/Caches/go-build"
    GOENV="/Users/c/Library/Application Support/go/env"
    GOEXE=""
    GOFLAGS=""
    GOHOSTARCH="amd64"
    GOHOSTOS="darwin"
    GOINSECURE=""
    GONOPROXY=""
    GONOSUMDB=""
    GOOS="darwin"
    GOPATH="/Users/c/go"
    GOPRIVATE=""
    GOPROXY="https://goproxy.io"
    GOROOT="/usr/local/go"
    GOSUMDB="sum.golang.org"
    GOTMPDIR=""
    GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
    GCCGO="gccgo"
    ...
  3. What did you do?

go get -u github.com/beego/bee/v2
go get -u github.com/beego/beego/v2
bee fix -t 2
  1. 结果 orm 不支持了
    2020/12/17 11:00:32 ERROR    ▶ 0004 Failed to build the application: # beego2Project/models
    models/MyModel.go:53:9: cannot use params (type "github.com/beego/beego/v2/adapter/orm".Params) as type "github.com/beego/beego/v2/client/orm".Params in argument to o.QueryTable(new(MyModel)).Filter(“id”, id).Update

回答

9

我初看起来是新老混用了,可以提供一下这个代码片段吗?按照道理来说,升级之后,应该全部都是使用adapter模块下的东西,包括params。

5

升级之后,为啥不是beego/beego/v2 , 干嘛搞一顿 adapter。 直接 bee new 出来就是全部 beego/beego/v2 。 现在 执行

bee fix -t 2

之后, model 层是改成了 adtapter, 但是 orm 的Update 方法指向的是 client/orm 的Update 方法。

func (ro *MyModel) UpdateById(id string, params orm.Params) (int64, error) {
    o := orm.NewOrm()
    num, err := o.QueryTable(new(MyModel)).
        Filter("Id", id).
        Filter("status", STATUS_WAIT).
        Update(params)
    return num, err
}
1

因为API修改过,所以不能直接升级过去,而是要指向adapter。adapter是利用新的API来重新兼容老的API,不然升级之路就只能是自己手动改写那些修改不兼容的API。

你的例子里面,orm要么都是adapter下的orm,要么都是v2下的adapter,对么?还是说混了?

9

因为API修改过,所以不能直接升级过去,而是要指向adapter。adapter是利用新的API来重新兼容老的API,不然升级之路就只能是自己手动改写那些修改不兼容的API。

你的例子里面,orm要么都是adapter下的orm,要么都是v2下的adapter,对么?还是说混了?

混了。等于说

 bee fix t 2 

迁移之后 , 引入的包是全部替换到 adapter 里面了。但是使用 adapter 的 orm 时,

 o := orm.NewOrm()
    num, err := o.QueryTable(new(MyModel)).
        Filter("Id", id).
        Filter("status", STATUS_WAIT).
        Update(params)  

中的 Update 方法使用 Goland 看定义处,其实看到指向的是 beego/beego/v2/client/orm 的 Update 方法了。我认为很可能是 adapter 内部的兼容问题。

目前只能从头开始 main.go 文件开始魔改了。一步步改下去,不能用

bee fix t 2 

的方式改。不如直接用 v2.0 开始搬。

8

你可以直接提供你升级前的一小段代码吗?我来看看能否修复掉。

0

你可以直接提供你升级前的一小段代码吗?我来看看能否修复掉。

我已经直接从头开始,将所有的adapter 都去掉了,从main.go 开始,全部迁移到全新到v2.0 了。没有再用adapter了。

2

我先关了,以后有问题我再看看。