gorm存指针数据_gorm使用小结

本文详细介绍了GORM在Go语言中操作数据库时如何处理结构体指针数据,包括增、删、改、查等基本操作。使用`db.Create()`、`db.Save()`进行新增和更新,`db.Delete()`进行删除,`db.Model().Update()`和`db.Model().Updates()`进行修改。GORM提供了链式方法,允许灵活地指定表名、条件等。在处理时间类型时,需注意时区的影响,并正确设置NULL值。
摘要由CSDN通过智能技术生成

db.Create(user)

db.Save(user)

参数只能用**结构体指针****,因为要根据指针写入该条插入的数据,

所以user可以作为该条数据使用。

新增只能用结构体

save方法在没有主键的时候是新增,有主键的时候是更新,save可以解决空字段问题。

可以使用 db.NewRecord()判断,该方法只检查 结构体对应数据表 的主键是否为空,不查表。

db.Delete(&User{})

db.Modle(&User{}).Update()

db.Modle(&User{}).Updates()

1.Modle可以传入&user, 得到的是 已修改 字段的struct,其他字段是默认字段,

2.map类型只能更新到外层(里层指针类型的字段会被置为空),嵌套的struct要解析到struct上去更新。

update更新单列,Update("name","wl")或者当Updates用。

updates可以传入map/struct。

struct只更新非零值的字段。

map的key可以是struct的key,也可以是数据表列名。

map的value要对应struct的类型,比如map[string]interface{}{"updated_at": time.Now()},不能使用字符串。

db.First(&user)

db.Last(&user)

db.Take(&user)

db.Find(&users) users := make([]User, 0)

db.Scan()

结果放入另一个struct

db.Pluck("name", &names) names := make([]stirng, 0)

单个字段的slice

查询条件可以在Where中增加,也可以内联,First(&user, "id=?", 1)

其他

gorm的增删改查是 链式方法,每次返回*gorm.DB,即可任意拼接。

db.Table("users") 或者 db.Modle(&User{}) 指定表名

db.Where("name=?", name)

示例

查询结果为一个数字时要用struct来接收

type Amount struct { Total float64 }

amount := Amount{}

db.Select("SUM(price) AS total").Scan(&amount)

更新设置NULL

struct是指针类型,Update("deleted_at", nil)

否则 Update("name", gorm.Expr("NULL))

Updates(map[string]interface{}{"name": gorm.Expr("NULL")})

类型

gorm: bool, time必须是对应的类型,mysql则可以是0, 1 和字符串。

gorm 类型对不上则会使用对应struct的零值。

时区

创建记录时:

必须要是time类型,会根据时区来确定插入的数据时间。

go时间 go时区 数据库存储时间 数据库显示时间

2019-12-01 08:00:00 +8:00 2019-12-01 00:00:00 UTC 2019-12-01 08:00:00

2019-12-01 08:00:00 +0:00 2019-12-01 08:00:00 UTC 2019-12-01 16:00:00

查询时:

1.可以用Where("updated_at < ?", "2019-12-01");

2.时区不影响查询,只将时间部分作为本地时间进行查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值