今天遇到一个问题,更新数据库的时候,更新其他类型的值都可以成功更新,但是更新bool类型的值的时候一直更新不成功,怎么测都不成功。
data = model.Resource{
	IsShow:   isshow,
	UpdateAt: updateAt,
err = db.DbConn.Table(resourceName).Where("id = ? ", resourceId).Update(&data).Error
if err != nil {
	LOG.Error("failed to update Resource:", err)
	return results, err

更新状态的时候,将flase改为true成功,但是将true改为false的时候一直不成功,但是也不报错。
打印出sql语句发现语句中没有isshow这个条件。
此处是因为bool值的零值是false,即当传入的isShow这个字段是false时,会默认判定为此处 的isshow没有输入,所以才造成这个问题。
在此记录一下。

解决:
将model.Resource中的IsShow字段设置成指针类型,即*bool类型,然后修改相对应的代码,重启服务,更新成功。

Gormigrate Gormigrate是Gorm的迁移助手。 Gorm已经具有有用的迁移功能,只是缺少适当的架构版本控制和回滚功能。 支持的数据库它支持数据库Go Gormigrate Gormigrate是Gorm的简约迁移助手。 Gorm已经具有有用的迁移功能,只是缺少适当的架构版本控制和迁移回滚支持。 支持的数据库它支持Gorm支持的任何数据库PostgreSQL MySQL SQLite Microsoft SQL Server安装go get -u gopkg.in/gormigrate.v1用法包main import(“ log”“ gopkg.in/gormigrate.v1”“ github.com / jinzhu / gorm“ _” github.com/jinzhu/gorm/dialects/sqlite“)func main( $ go get github.com/sunary/gorm-bulk-insert 这个库依赖于 gorm,除非你已经安装了 gorm,否则下面的命令也是必要的。 $ go get github.com/jinzhu/gorm bulk . BulkInsert ( db , bulkData ) // or bulk . BulkInsertWithTableName ( db , tableName , bulkData ) bulk . BulkUpsert ( db , bulkData , uniqueKeys ) // or bulk . BulkUpsertWithTableName 坏处也是显而易见的: 开发者与最终的sql语句隔了一层orm,因此可能会不慎引入烂sql 依赖于orm的成熟度,无法进行一些「复杂」的查询。当然,复杂的查询一大半都是应该从设计上规避的 留意不合法的时间 MySQL的DATE/DATATIME类型可以对应Golang的time.Time。但是,如果DATE/DATATIME不慎插入了一个无效,例如2016-00-00 00:00:00, 那么这条记录是无法查询出来的。会返回gorm.R golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:字段映射-模型定义 gorm中通常用struct来映射字段. gorm教程中叫模型定义 比如我们定义一个模型Model: type User struct { gorm.Model UserId int64 `gorm:"index"` //设置一个普通的索引,没有设置索引名,gorm会自动命名 Birtheday time.Time Age int `gorm:"column:age"`//colu 1.官方文档描述 官方文档说的比较清楚,当update方法传入的是struct类型的数据时,如果字段数据是对应类型的0,则对应字段不更新。 比如如果我想把数据库里某个int字段改为0,字符串类型改为"",传入struct类型,是改不成功的。 // WARNING when update with struct, GORM will not update fields that with zero value func (s *DB) Update(attrs ...interface{}) *DB { 注意,Init 和 Create 的区别,如果没有找到,这里会把实例给初始化,不会存入 DB,可以看到 RowsAffected == 0 分支的处理,这里并不会走 Create 的 callback 函数。需要注意的是,所谓 OnConflict,并不一定是主键冲突,唯一键也包含在内。所以,要实现 CreateOrUpdate,我们可以将需要 Update 的属性通过 Assign 函数放进来,随后如果通过 Where 找到了记录,也会将 Assign 属性应用上,随后 Update。 在gorm中,想要实现“如果存在就更新,否则就插入”的需求,可以通过以下方式实现 db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, // 这里的列必须是唯一的,比如主键或是唯一索引 DoUpdates: clause.AssignmentColumns([]string{"num", "title"}), // 更新哪些字段 }).Create(&User{ Desc: "ee" 定义一个Status数据类型和LocalTime数据类型,分别表示状态和时间,并实现Valuer和Scanner接口(这里不过多解释,要想在gorm使用自定义数据类型,这里是必须要懂的,不了解的话可以看gorm自定义数据类型官方文档) 说一下我自定义这两个数据类型的目的,想通过定义Status实现枚举,定义LocalTime实现时间的读取格式化 type Sta