Closed wzhsh90 closed 4 years ago
func(name string, pageIndex, pageSize int64) ([]models.DownloadInfo, error)
mapperParams:"name,pageIndex,pageSize"
发现在有时pageIndex与pageSize 数据在数据库查询时交换了,不知道是什么原因。重启项目就正常了。
信息太少了,提供下具体代码,伪代码也行。然后执行结果也打印下贴上来。
1、
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]
那个pageIndex,pageSize 是随机的,不是每次都是
那个pageIndex,pageSize 是随机的,不是每次都是
那个pageIndex,pageSize 是随机的,不是每次都是
我试了下,最新版顺序是正确的,只不过 打印的时候fmt.Sprint 会把空对象编程 空字符串,会以为少了一个,或者顺序错了
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 int64json:"del_flag"
DownCnt int64json:"down_cnt"
FileID stringjson:"file_id"
ID stringjson:"id"
InfoName stringjson:"info_name"
Remark stringjson:"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]
更新到最新的版本可以试试
我现在用的版本是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 里面怎么还是会出现对应错误???
这个不能保证的话,这个项目使用有点恼火哟
具体代码发一下
我现在用的版本是github.com/zhuxiujia/GoMybatis v6.0.0+incompatible 自己手动写insert sql 语句,然后任意插入一下model,字段有时不会正确映射,这个问题有点严重哟
type DownloadInfo struct { CreateTime int64
json:"create_time"
DelFlag int64json:"del_flag"
DownCnt int64json:"down_cnt"
FileID stringjson:"file_id"
ID stringjson:"id"
InfoName stringjson:"info_name"
AttachName stringjson:"attach_name"
Remark stringjson:"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]
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错了,不是每次映射有问题,是有时(不知道是怎么出来的)
type SysFile struct { AttachName string
json:"attach_name"
CreateTime int64json:"create_time"
DelFlag int64json:"del_flag"
GroupID stringjson:"group_id"
ID stringjson:"id"
RealName stringjson:"real_name"
} 是这个,发copy错了,不是每次映射有问题,是有时(不知道是怎么出来的)
你更新到最新版本,再试试,理论上按照example的写法来,没有问题的。
我是使用mod方式,你没有发布新版本,我怎么更新?难道使用go path 处理?
我是使用mod方式,你没有发布新版本,我怎么更新?难道使用go path 处理?
新版本有带有go.mod
github.com/zhuxiujia/GoMybatis v6.0.0+incompatible 这个要修改为什么?
github.com/zhuxiujia/GoMybatis v6.0.0+incompatible 这个要修改为什么?
改成 github.com/zhuxiujia/GoMybatis v6.0.2
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
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
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]
就是正常的
[,5e5a685ae9cfa424d0209cc0,5e5a685ae9cfa424d0209cc 1,警训业务需求111]
你mapper.go 里面的函数咋写的看看,还有mapper.xml里面的内容
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:
mapper: Update func(arg models.DownloadInfo) (int64, error)
model: type DownloadInfo struct { CreateTime int64
json:"create_time"
DelFlag int64json:"del_flag"
DownCnt int64json:"down_cnt"
FileID stringjson:"file_id"
ID stringjson:"id"
InfoName stringjson:"info_name"
AttachName stringjson:"attach_name"
Remark stringjson:"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
现在是越修改越错哟,原来这个是没有问题的 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"
个人建议多做点测试,不然有点乱了
现在是越修改越错哟,原来这个是没有问题的 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 这回可以了
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,必须得有数据变化
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 当然是 有修改的记录才会返回的呀,意思是返回修改了多少行记录。
也就是传入数据与数据库中数据都一样时,rowsaffected是0 ,而实际应该返回 1
也就是传入数据与数据库中数据都一样时,rowsaffected是0 ,而实际应该返回 1
在mysql客户端navcat里面 执行下 一抹一样的sql,看看 rowsaffected返回是不是1呀?
我知道你的意思,navicat 里面是返回0,但实际情况应该是返回1。
你在java 里面用mybatis 测试相同数据修改会返回影响行数为1
如果按照rowsaffected 来处理业务逻辑,那不是返回0,1 都表示修改成功?
我知道你的意思,navicat 里面是返回0,但实际情况应该是返回1。
你在java 里面用mybatis 测试相同数据修改会返回影响行数为1
如果按照rowsaffected 来处理业务逻辑,那不是返回0,1 都表示修改成功?
我明白你的意思了,JAVA mybatis 的 update 操作返回值是记录的 matched 的条数,并不是影响的记录条数, 严格来说 这样不严谨不是吗?明明一条记录都没有改哎
我知道你的意思,navicat 里面是返回0,但实际情况应该是返回1。
你在java 里面用mybatis 测试相同数据修改会返回影响行数为1
如果按照rowsaffected 来处理业务逻辑,那不是返回0,1 都表示修改成功?
严格来说,你业务逻辑里面应该是 rowsaffected 返回1 的情况下才是修改了记录,0的话 应该看做修改未成功。
对业务逻辑处理有影响,最好是借鉴java 那边方式,java mybatis 是成熟框架,想想人家为什么不这么处理,肯定是有道理的
对业务逻辑处理有影响,最好是借鉴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里用版本号乐观锁也行
你可以去使用一下其他golang 写的orm ,比如bee ,操作后你就知道了。
我个人比较赞成java mybatis的处理方案
你可以去使用一下其他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的话,我感觉会产生歧义 官方的抽象接口只给了这个,我们就返回这个。
如果是这样,那个业务逻辑判断就只能通过err来判断了,没有err就是表示是处理成功了
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 里面怎么还是会出现对应错误???
这个不能保证的话,这个项目使用有点恼火哟
你是采用map 存储的参数值,但是众多参数值没有保证与sql prepare ? 占位是对应一致的
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 里面怎么还是会出现对应错误???
这个不能保证的话,这个项目使用有点恼火哟
具体代码发一下
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"
}
mapper: Add func(arg models.SysFile) (int64, error)
type SysFile struct { AttachName string
json:"attach_name"
CreateTime int64json:"create_time"
DelFlag int64json:"del_flag"
GroupID stringjson:"group_id"
ID stringjson:"id"
RealName stringjson:"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]
随机出来
1次成功不代表永远成功
你检查一下你perpare sql地方,不能保证占位符对应数据一致
//执行子所有节点 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 就已经顺序错了
问题应该是Node解析问题
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 就已经顺序错了
问题应该是Node解析问题
解析node的时候用了map导致的(本来想去重的,但是实际上不能去重,否则导致异常),现在改成github.com/zhuxiujia/GoMybatis v6.1.6+incompatible 就正常了
多测试一下,不然你这个项目一下项目开发就挂了
多测试一下,不然你这个项目一下项目开发就挂了
之前的版本一切正常,最近的版本重构加入了ParperdStatement 防止sql注入,所以导致的bug
多测试一下,不然你这个项目一下项目开发就挂了
还有碰到bug不?
func(name string, pageIndex, pageSize int64) ([]models.DownloadInfo, error)
mapperParams:"name,pageIndex,pageSize"
发现在有时pageIndex与pageSize 数据在数据库查询时交换了,不知道是什么原因。重启项目就正常了。