起源

没有报错,也没执行,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
    }

进一步的原因

需要进一步看源码,有空补充


vincent
49 声望2 粉丝

引用和评论

0 条评论