zhuxiujia / GoMybatis

Go ORM Library.Have Powerful Features like transaction nesting, Optimistic Lock,Logical deletion and more. like mybatis for go golang
https://zhuxiujia.github.io/gomybatis.io/#/
Apache License 2.0
431 stars 97 forks source link

映射字段对应顺序不对应 #42

Closed wzhsh90 closed 4 years ago

wzhsh90 commented 4 years ago

func(name string, pageIndex, pageSize int64) ([]models.DownloadInfo, error) mapperParams:"name,pageIndex,pageSize"

发现在有时pageIndex与pageSize 数据在数据库查询时交换了,不知道是什么原因。重启项目就正常了。

zhuxiujia commented 4 years ago

func(name string, pageIndex, pageSize int64) ([]models.DownloadInfo, error) mapperParams:"name,pageIndex,pageSize"

发现在有时pageIndex与pageSize 数据在数据库查询时交换了,不知道是什么原因。重启项目就正常了。

信息太少了,提供下具体代码,伪代码也行。然后执行结果也打印下贴上来。

wzhsh90 commented 4 years ago

1、 update download_info_t set info_name=#{InfoName},remark=#{Remark},file_id=#{FileID} where id=#{id}

2、type DownloadInfo struct { CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" DownCnt int64 json:"down_cnt" FileID string json:"file_id" ID string json:"id" InfoName string json:"info_name" Remark string json:"remark" } 3、Update func(arg models.DownloadInfo) (int64, error)

4、 2020/02/27 20:30:49 [GoMybatis] [62f35842-fbcf-46a6-96ac-d619b276c580] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/02/27 20:30:49 [GoMybatis] [62f35842-fbcf-46a6-96ac-d619b276c580] Param ==> [5e57b503e9cfa4271c52dc41 警训业务需求1 5e57b503 e9cfa4271c52dc3f]

这样的代码映射也是有问题的, id:5e57b503e9cfa4271c52dc41 info_name:警训业务需求1 file_id: 5e57b503e9cfa4271c52dc3f 没有按字段一一对应,错位了。

正常逻辑应该是下面这样: 2020/02/27 20:34:21 [GoMybatis] [4fc73420-9298-4322-93ac-2e916b7055a6] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/02/27 20:34:21 [GoMybatis] [4fc73420-9298-4322-93ac-2e916b7055a6] Param ==> [警训业务需求1 111 5e57b503e9cfa4271c52dc3f 5e57b503e9cfa4271c52dc41]

wzhsh90 commented 4 years ago

那个pageIndex,pageSize 是随机的,不是每次都是

zhuxiujia commented 4 years ago

那个pageIndex,pageSize 是随机的,不是每次都是

那个pageIndex,pageSize 是随机的,不是每次都是

我试了下,最新版顺序是正确的,只不过 打印的时候fmt.Sprint 会把空对象编程 空字符串,会以为少了一个,或者顺序错了

zhuxiujia commented 4 years ago

1、 update download_info_t set info_name=#{InfoName},remark=#{Remark},file_id=#{FileID} where id=#{id} 2、type DownloadInfo struct { CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" DownCnt int64 json:"down_cnt" FileID string json:"file_id" ID string json:"id" InfoName string json:"info_name" Remark string json:"remark" } 3、Update func(arg models.DownloadInfo) (int64, error)

4、 2020/02/27 20:30:49 [GoMybatis] [62f35842-fbcf-46a6-96ac-d619b276c580] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/02/27 20:30:49 [GoMybatis] [62f35842-fbcf-46a6-96ac-d619b276c580] Param ==> [5e57b503e9cfa4271c52dc41 警训业务需求1 5e57b503 e9cfa4271c52dc3f]

这样的代码映射也是有问题的, id:5e57b503e9cfa4271c52dc41 info_name:警训业务需求1 file_id: 5e57b503e9cfa4271c52dc3f 没有按字段一一对应,错位了。

正常逻辑应该是下面这样: 2020/02/27 20:34:21 [GoMybatis] [4fc73420-9298-4322-93ac-2e916b7055a6] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/02/27 20:34:21 [GoMybatis] [4fc73420-9298-4322-93ac-2e916b7055a6] Param ==> [警训业务需求1 111 5e57b503e9cfa4271c52dc3f 5e57b503e9cfa4271c52dc41]

更新到最新的版本可以试试

wzhsh90 commented 4 years ago

我现在用的版本是github.com/zhuxiujia/GoMybatis v6.0.0+incompatible 自己手动写insert sql 语句,然后任意插入一下model,字段有时不会正确映射(具有随机性),这个问题有点严重哟

type DownloadInfo struct { CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" DownCnt int64 json:"down_cnt" FileID string json:"file_id" ID string json:"id" InfoName string json:"info_name" AttachName string json:"attach_name" Remark string json:"remark" }

<insert id="Add">
    INSERT INTO
    sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES(#{ID},#{GroupID},#{AttachName},#{RealName},#{CreateTime},0)
</insert>

16:42:55 app | 2020/03/01 16:42:55 [GoMybatis] [a2fa56ac-1422-4c50-be17-744094834a2a] Exec ==> INSERT INTO sys_fi le_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES( ? , ? , ? , ? , ? ,0) 16:42:55 app | [GIN] 2020/03/01 - 16:42:55 | 200 | 6.9965ms | ::1 | POST /file/upload 16:42:55 app | 2020/03/01 16:42:55 [GoMybatis] [a2fa56ac-1422-4c50-be17-744094834a2a] Args ==> [1583052175,5e5b758fe9cfa44 be8be3e61,5e5b7564e9cfa434c453bbc9,警训业务需求.png,2020-03-01/5e5b758fe9cfa44be8be3e60.png]

6.1.5 里面怎么还是会出现对应错误???

这个不能保证的话,这个项目使用有点恼火哟

具体代码发一下

zhuxiujia commented 4 years ago

我现在用的版本是github.com/zhuxiujia/GoMybatis v6.0.0+incompatible 自己手动写insert sql 语句,然后任意插入一下model,字段有时不会正确映射,这个问题有点严重哟

type DownloadInfo struct { CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" DownCnt int64 json:"down_cnt" FileID string json:"file_id" ID string json:"id" InfoName string json:"info_name" AttachName string json:"attach_name" Remark string json:"remark" }

<insert id="Add">
    INSERT INTO
    sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES(#{ID},#{GroupID},#{AttachName},#{RealName},#{CreateTime},0)
</insert>

执行正确的呀,6.0.0打印log的时候用fmt.Sprint 打印 很容易看错的,新版本打印加了逗号就清楚了 你定义的模型里面 没有GroupID和RealName,这2个值会变成nil空指针

var result, err = exampleActivityMapper.Add(DownloadInfo{
        CreateTime:20200228,
        DelFlag:1,
        DownCnt:2,
        FileID:"4",
        ID:"id",
        InfoName:"InfoName",
        AttachName:"AttachName",
        Remark:"Remark",
    })
    if err != nil {
        panic(err)
    }
    fmt.Println("result=", result)

2020/02/28 16:52:53 [GoMybatis] [a120fe23-2877-42af-ae10-8c79a878ac5d] Exec ==>  INSERT INTO         sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES( ? , ? , ? , ? , ? ,0)
2020/02/28 16:52:53 [GoMybatis] [a120fe23-2877-42af-ae10-8c79a878ac5d] Param ==> [id,<nil>,AttachName,<nil>,20200228]
wzhsh90 commented 4 years ago

type SysFile struct { AttachName string json:"attach_name" CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" GroupID string json:"group_id" ID string json:"id" RealName string json:"real_name" } 是这个,发copy错了,不是每次映射有问题,是有时(不知道是怎么出来的)

zhuxiujia commented 4 years ago

type SysFile struct { AttachName string json:"attach_name" CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" GroupID string json:"group_id" ID string json:"id" RealName string json:"real_name" } 是这个,发copy错了,不是每次映射有问题,是有时(不知道是怎么出来的)

你更新到最新版本,再试试,理论上按照example的写法来,没有问题的。

wzhsh90 commented 4 years ago

我是使用mod方式,你没有发布新版本,我怎么更新?难道使用go path 处理?

zhuxiujia commented 4 years ago

我是使用mod方式,你没有发布新版本,我怎么更新?难道使用go path 处理?

新版本有带有go.mod

wzhsh90 commented 4 years ago

github.com/zhuxiujia/GoMybatis v6.0.0+incompatible 这个要修改为什么?

zhuxiujia commented 4 years ago

github.com/zhuxiujia/GoMybatis v6.0.0+incompatible 这个要修改为什么?

改成 github.com/zhuxiujia/GoMybatis v6.0.2

wzhsh90 commented 4 years ago

require github.com/zhuxiujia/GoMybatis: version "v6.0.2" invalid: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v6

zhuxiujia commented 4 years ago

require github.com/zhuxiujia/GoMybatis: version "v6.0.2" invalid: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v6

改成这个可以

github.com/zhuxiujia/GoMybatis v6.1.1+incompatible
wzhsh90 commented 4 years ago

6.1.1 版本,同样有问题 2020/02/29 21:36:51 [GoMybatis] [075c2306-9e51-4e05-a27c-5bcc8831df45] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/02/29 21:36:51 [GoMybatis] [075c2306-9e51-4e05-a27c-5bcc8831df45] Args ==> [,5e5a685ae9cfa424d0209cc0,5e5a685ae9cfa424d0209cc 1,警训业务需求111] 2020/02/29 21:36:51 [GoMybatis] [075c2306-9e51-4e05-a27c-5bcc8831df45] Close session 2020/02/29 21:36:51 [GoMybatis] [075c2306-9e51-4e05-a27c-5bcc8831df45] RowsAffected <== 0 警训业务需求111:这个本来对应的是info_name 5e5a685ae9cfa424d0209cc0:对应的是file_id 5e5a685ae9cfa424d0209cc:对应的是id remark 是空字符串,感觉这个顺序随机与字段有空格有影响,你再试试吧,老问题呀!!

remark 不为空时 /02/29 21:42:13 [GoMybatis] [e801fea4-680c-484b-a669-fd448fcc2b62] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/02/29 21:42:13 [GoMybatis] [e801fea4-680c-484b-a669-fd448fcc2b62] Args ==> [警训业务需求111,1,5e5a685ae9cfa424d0209cc0,5e5a68 5ae9cfa424d0209cc1]

就是正常的

zhuxiujia commented 4 years ago

[,5e5a685ae9cfa424d0209cc0,5e5a685ae9cfa424d0209cc 1,警训业务需求111]

你mapper.go 里面的函数咋写的看看,还有mapper.xml里面的内容

wzhsh90 commented 4 years ago

model: type DownloadInfo struct { CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" DownCnt int64 json:"down_cnt" FileID string json:"file_id" ID string json:"id" InfoName string json:"info_name" AttachName string json:"attach_name" Remark string json:"remark" } update:

update download_info_t set info_name=#{InfoName},remark=#{Remark},file_id=#{FileID} where id=#{id}

mapper: Update func(arg models.DownloadInfo) (int64, error)

zhuxiujia commented 4 years ago

model: type DownloadInfo struct { CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" DownCnt int64 json:"down_cnt" FileID string json:"file_id" ID string json:"id" InfoName string json:"info_name" AttachName string json:"attach_name" Remark string json:"remark" } update:

update download_info_t set info_name=#{InfoName},remark=#{Remark},file_id=#{FileID} where id=#{id}

mapper: Update func(arg models.DownloadInfo) (int64, error)

试试 github.com/zhuxiujia/GoMybatis v6.1.2+incompatible

wzhsh90 commented 4 years ago

现在是越修改越错哟,原来这个是没有问题的 2020/02/29 22:31:02 [GoMybatis] [f8cea7e2-766f-4a7a-a369-88889f6615bb] error == [GoMybatis][LocalSession]sql: converting argument $1 type: unsupported type []interface {}, a slice of interface

SelectOne func(name string) (models.User, error) mapperParams:"name"

个人建议多做点测试,不然有点乱了

zhuxiujia commented 4 years ago

现在是越修改越错哟,原来这个是没有问题的 2020/02/29 22:31:02 [GoMybatis] [f8cea7e2-766f-4a7a-a369-88889f6615bb] error == [GoMybatis][LocalSession]sql: converting argument $1 type: unsupported type []interface {}, a slice of interface

SelectOne func(name string) (models.User, error) mapperParams:"name" select id,account,password,com_id from sys_user_info_t where account=#{name} 个人建议多做点测试,不然有点乱了

试试 github.com/zhuxiujia/GoMybatis v6.1.5+incompatible 这回可以了

wzhsh90 commented 4 years ago

1、测试空格 2020/03/01 08:57:56 [GoMybatis] [a10c4f1c-ab23-43b3-a1c6-1130c0fb2b1f] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/03/01 08:57:56 [GoMybatis] [a10c4f1c-ab23-43b3-a1c6-1130c0fb2b1f] Args ==> [redis,,,5e58d128e9cfa4193060844f,5e58d129e9cfa419 30608451]

2、测试空串 2020/03/01 08:59:10 [GoMybatis] [ec3d499f-a55c-4822-97dc-ffaf5224bd23] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/03/01 08:59:10 [GoMybatis] [ec3d499f-a55c-4822-97dc-ffaf5224bd23] Args ==> [redis,,5e58d128e9cfa4193060844f,5e58d129e9cfa4193 0608451]

反馈a:1、2 日志显示不同,1中空格显示为 ","了 反馈b:数据不做任何修改直接提交则 RowsAffected <== 0 ,不会返回 RowsAffected <== 1,必须得有数据变化

zhuxiujia commented 4 years ago

1、测试空格 2020/03/01 08:57:56 [GoMybatis] [a10c4f1c-ab23-43b3-a1c6-1130c0fb2b1f] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/03/01 08:57:56 [GoMybatis] [a10c4f1c-ab23-43b3-a1c6-1130c0fb2b1f] Args ==> [redis,,,5e58d128e9cfa4193060844f,5e58d129e9cfa419 30608451]

2、测试空串 2020/03/01 08:59:10 [GoMybatis] [ec3d499f-a55c-4822-97dc-ffaf5224bd23] Exec ==> update download_info_t set info_name= ? ,remark= ? ,file_id= ? where id= ? 2020/03/01 08:59:10 [GoMybatis] [ec3d499f-a55c-4822-97dc-ffaf5224bd23] Args ==> [redis,,5e58d128e9cfa4193060844f,5e58d129e9cfa4193 0608451]

反馈a:1、2 日志显示不同,1中空格显示为 ","了 反馈b:数据不做任何修改直接提交则 RowsAffected <== 0 ,不会返回 RowsAffected <== 1,必须得有数据变化

不太理解。。。 RowsAffected 当然是 有修改的记录才会返回的呀,意思是返回修改了多少行记录。

wzhsh90 commented 4 years ago

也就是传入数据与数据库中数据都一样时,rowsaffected是0 ,而实际应该返回 1

zhuxiujia commented 4 years ago

也就是传入数据与数据库中数据都一样时,rowsaffected是0 ,而实际应该返回 1

在mysql客户端navcat里面 执行下 一抹一样的sql,看看 rowsaffected返回是不是1呀?

wzhsh90 commented 4 years ago

我知道你的意思,navicat 里面是返回0,但实际情况应该是返回1。

你在java 里面用mybatis 测试相同数据修改会返回影响行数为1

如果按照rowsaffected 来处理业务逻辑,那不是返回0,1 都表示修改成功?

zhuxiujia commented 4 years ago

我知道你的意思,navicat 里面是返回0,但实际情况应该是返回1。

你在java 里面用mybatis 测试相同数据修改会返回影响行数为1

如果按照rowsaffected 来处理业务逻辑,那不是返回0,1 都表示修改成功?

我明白你的意思了,JAVA mybatis 的 update 操作返回值是记录的 matched 的条数,并不是影响的记录条数, 严格来说 这样不严谨不是吗?明明一条记录都没有改哎

zhuxiujia commented 4 years ago

我知道你的意思,navicat 里面是返回0,但实际情况应该是返回1。

你在java 里面用mybatis 测试相同数据修改会返回影响行数为1

如果按照rowsaffected 来处理业务逻辑,那不是返回0,1 都表示修改成功?

严格来说,你业务逻辑里面应该是 rowsaffected 返回1 的情况下才是修改了记录,0的话 应该看做修改未成功。

wzhsh90 commented 4 years ago

对业务逻辑处理有影响,最好是借鉴java 那边方式,java mybatis 是成熟框架,想想人家为什么不这么处理,肯定是有道理的

zhuxiujia commented 4 years ago

对业务逻辑处理有影响,最好是借鉴java 那边方式,java mybatis 是成熟框架,想想人家为什么不这么处理,肯定是有道理的

不是的,go这边必须严格按照 go官方驱动接口的设计,所有驱动程序不管mysql也好,pg也好,sqllite,都得遵循官方标准 你可以看看 go标准库 里面 database/sql 里面Result 接口的定义

// A Result summarizes an executed SQL command.
type Result interface {
    // LastInsertId returns the integer generated by the database
    // in response to a command. Typically this will be from an
    // "auto increment" column when inserting a new row. Not all
    // databases support this feature, and the syntax of such
    // statements varies.
    LastInsertId() (int64, error)

    // RowsAffected returns the number of rows affected by an
    // update, insert, or delete. Not every database or database
    // driver may support this.
    RowsAffected() (int64, error)
}

可以看到 官方设计的驱动 update操作 只给了2个东西,一个是影响行数,一个是上次修改的id.

java mybatis 那样的做法会导致 有一次无效的update操作,浪费消耗一次数据库的io了的。 正确的做法我认为应该是业务逻辑里面判断 有没有必要更新,有必要的时候再去操作,也就是先判断旧值再去更新旧值。具体做法 写代码里也可以,写在sql里用版本号乐观锁也行

wzhsh90 commented 4 years ago

你可以去使用一下其他golang 写的orm ,比如bee ,操作后你就知道了。

我个人比较赞成java mybatis的处理方案

zhuxiujia commented 4 years ago

你可以去使用一下其他golang 写的orm ,比如bee ,操作后你就知道了。

我个人比较赞成java mybatis的处理方案

嗯,2种做法理论上都可以实现 我看来下beego返回的update 结果也是和我一样的,其他的例如gorm也是类似,都和go官方设计一致

res, err := orm.Exec(statement, args...)
    if err != nil {
        return -1, err
    }
    id, err := res.RowsAffected()

我个人还是比较倾向于go官方的设计, 如果一个update操作没有影响记录返回了1而不是0的话,我感觉会产生歧义 官方的抽象接口只给了这个,我们就返回这个。

wzhsh90 commented 4 years ago

如果是这样,那个业务逻辑判断就只能通过err来判断了,没有err就是表示是处理成功了

wzhsh90 commented 4 years ago

16:42:55 app | 2020/03/01 16:42:55 [GoMybatis] [a2fa56ac-1422-4c50-be17-744094834a2a] Exec ==> INSERT INTO sys_fi le_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES( ? , ? , ? , ? , ? ,0) 16:42:55 app | [GIN] 2020/03/01 - 16:42:55 | 200 | 6.9965ms | ::1 | POST /file/upload 16:42:55 app | 2020/03/01 16:42:55 [GoMybatis] [a2fa56ac-1422-4c50-be17-744094834a2a] Args ==> [1583052175,5e5b758fe9cfa44 be8be3e61,5e5b7564e9cfa434c453bbc9,警训业务需求.png,2020-03-01/5e5b758fe9cfa44be8be3e60.png]

6.1.5 里面怎么还是会出现对应错误???

这个不能保证的话,这个项目使用有点恼火哟

wzhsh90 commented 4 years ago

你是采用map 存储的参数值,但是众多参数值没有保证与sql prepare ? 占位是对应一致的

zhuxiujia commented 4 years ago

16:42:55 app | 2020/03/01 16:42:55 [GoMybatis] [a2fa56ac-1422-4c50-be17-744094834a2a] Exec ==> INSERT INTO sys_fi le_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES( ? , ? , ? , ? , ? ,0) 16:42:55 app | [GIN] 2020/03/01 - 16:42:55 | 200 | 6.9965ms | ::1 | POST /file/upload 16:42:55 app | 2020/03/01 16:42:55 [GoMybatis] [a2fa56ac-1422-4c50-be17-744094834a2a] Args ==> [1583052175,5e5b758fe9cfa44 be8be3e61,5e5b7564e9cfa434c453bbc9,警训业务需求.png,2020-03-01/5e5b758fe9cfa44be8be3e60.png]

6.1.5 里面怎么还是会出现对应错误???

这个不能保证的话,这个项目使用有点恼火哟

具体代码发一下

wzhsh90 commented 4 years ago

type SysFile struct { AttachName string json:"attach_name" CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" GroupID string json:"group_id" ID string json:"id" RealName string json:"real_name" }

INSERT INTO sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES(#{ID},#{GroupID},#{AttachName},#{RealName},#{CreateTime},0)

mapper: Add func(arg models.SysFile) (int64, error)

zhuxiujia commented 4 years ago

type SysFile struct { AttachName string json:"attach_name" CreateTime int64 json:"create_time" DelFlag int64 json:"del_flag" GroupID string json:"group_id" ID string json:"id" RealName string json:"real_name" }

INSERT INTO sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES(#{ID},#{GroupID},#{AttachName},#{RealName},#{CreateTime},0)

mapper: Add func(arg models.SysFile) (int64, error)

 //INSERT INTO  sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES(#{ID},#{GroupID},#{AttachName},#{RealName},#{CreateTime},0)
var result, err = exampleActivityMapper.Add(SysFile{
          AttachName:"AttachName",
          CreateTime:20190909,
          DelFlag:1,
          GroupID:"GroupID",
          ID:"ID",
          RealName:"RealName",
    })
    if err != nil {
        panic(err)
    }
2020/03/01 17:00:34 [GoMybatis] [5e4eddbe-d253-42f6-b102-b7eef847644d] Exec ==>  INSERT INTO  sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES( ? , ? , ? , ? , ? ,0)
2020/03/01 17:00:34 [GoMybatis] [5e4eddbe-d253-42f6-b102-b7eef847644d] Args ==> [ID,GroupID,AttachName,RealName,20190909]
wzhsh90 commented 4 years ago

随机出来

1次成功不代表永远成功

你检查一下你perpare sql地方,不能保证占位符对应数据一致

wzhsh90 commented 4 years ago
INSERT INTO sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES(#{ID},#{GroupID},#{AttachName},#{RealName},#{CreateTime},0)

//执行子所有节点 func DoChildNodes(childNodes []Node, env map[string]interface{}, argarray *[]interface{}) ([]byte, error) { if childNodes == nil { return nil, nil } var sql bytes.Buffer for , v := range childNodes { var r, e = v.Eval(env, arg_array) if e != nil { return nil, e } if r != nil { sql.Write(r) } } var bytes = sql.Bytes() sql.Reset() return bytes, nil } 这个地方childNodes 就已经顺序错了 22

问题应该是Node解析问题

zhuxiujia commented 4 years ago

INSERT INTO sys_file_t(id,group_id,attach_name,real_name,create_time,del_flag)VALUES(#{ID},#{GroupID},#{AttachName},#{RealName},#{CreateTime},0) //执行子所有节点 func DoChildNodes(childNodes []Node, env map[string]interface{}, argarray *[]interface{}) ([]byte, error) { if childNodes == nil { return nil, nil } var sql bytes.Buffer for , v := range childNodes { var r, e = v.Eval(env, arg_array) if e != nil { return nil, e } if r != nil { sql.Write(r) } } var bytes = sql.Bytes() sql.Reset() return bytes, nil } 这个地方childNodes 就已经顺序错了 22

问题应该是Node解析问题

解析node的时候用了map导致的(本来想去重的,但是实际上不能去重,否则导致异常),现在改成github.com/zhuxiujia/GoMybatis v6.1.6+incompatible 就正常了

wzhsh90 commented 4 years ago

多测试一下,不然你这个项目一下项目开发就挂了

zhuxiujia commented 4 years ago

多测试一下,不然你这个项目一下项目开发就挂了

之前的版本一切正常,最近的版本重构加入了ParperdStatement 防止sql注入,所以导致的bug

zhuxiujia commented 4 years ago

多测试一下,不然你这个项目一下项目开发就挂了

还有碰到bug不?