起源
没有报错,也没执行,debug也没有sql。一开始issue没翻到东西,以为是我犯了低级错误配置错了,疯狂看之前的代码,一模一样的配置,一模一样的调用,直到看见这个
https://github.com/go-gorm/gorm/issues/6778
搜索了下自己以前的笔记,发现好几年前遇到过一次,因为这个有很多接口我都是自己写sql
【案例1】count没有指定table
找到sql
gorm不执行、不报错这点可以接受,但debug没有任何sql打印出来这就玄幻了,需要先把sql打印出来,有了sql才能进一步定位
// db.Default()项目中有很多个数据库,所以稍微封装了下用这个拿默认数据库
err := db.Default().Debug().Where("USERNAME = ?", username).Count(&count).Error
// 下面这样也不会有sql
testDB := db.Default().Debug()
testDB.Where("USERNAME = ?", username).Count(&count)
// 下面这样也不会有sql
testDB := db.Default().Debug()
err := testDB.Where("USERNAME = ?", username).Count(&count).Error
没有table
开始尝试使用不一样的写法,如下语句打印出了sql
db.Default().Debug().Where("USERNAME = ?", username).Scan(&user)
sql很奇怪,没有table
SELECT * FROM ` WHERE USERNAME = 'cc'
核实User结构体, 有写tablename
type User struct {}
func (u *User) TableName() string {
return "users"
}
如果使用指定table,执行正常
db.Default().Debug().Table("users").Where("USERNAME = ?", username).Scan(&user)
另一个成功的项目代码
以下是另一个项目执行正常的功能
type Product struct {}
func (p *Product) TableName() string {
return "products"
}
db.Default().Where("PAGE_ID = ? AND PAGE_STATUS = ?", pageId, "publish").Order("UPDATED_AT desc").First(&page).Error
原因:没有table
使用where的查询语句没看出哪里有问题。不过回头看一开始代码,确实存在表名问题
err := db.Default().Debug().Where("USERNAME = ?", username).Count(&count).Error
【案例2】零值问题导致不更新、也不会输出sql
if err := db.Model(&models.Agent{}).Where("id =?", 2).Updates(models.Agent{SourceLevel: 0}).Error; err != nil {
log.Printf("this is err from updates, %v\n", err)
return
}
修改:使用update
if err := db.Model(&models.MTest{}).Where("id =?", 1).Update("source_level", 0).Error; err != nil {
log.Printf("this is err from updates, %v\n", err)
return
}
进一步的原因
需要进一步看源码,有空补充
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。