今天遇到一个问题,更新数据库的时候,更新其他类型的值都可以成功更新,但是更新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