Copyright © 2022-2025 aizws.net · 网站版本: v1.2.6·内部版本: v1.25.2·
页面加载耗时 0.00 毫秒·物理内存 180.7MB ·虚拟内存 1439.6MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
这里给出 Mysql 表结构定义和 golang 结构体定义。
下面是教程用到的 foods 表结构定义:
CREATE TABLE `foods` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品id', `title` varchar(100) NOT NULL COMMENT '商品名', `price` float DEFAULT '0' COMMENT '商品价格', `stock` int(11) DEFAULT '0' COMMENT '商品库存', `type` int(11) DEFAULT '0' COMMENT '商品类型', `create_time` datetime NOT NULL COMMENT '商品创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
下面是 foods 表对应的 golang 结构体类型
// 商品
type Food struct {
Id int
Title string
Price float32
Stock int
Type int
//mysql datetime, date类型字段,可以和golang time.Time类型绑定, 详细说明请参考:gorm连接数据库章节。
CreateTime time.Time
}
// 为Food绑定表名
func (v Food) TableName() string {
return "foods"
}
用于保存模型变量的值。
提示: 相当于根据主键id,更新所有模型字段值。
food := Food{}
// 先查询一条记录, 保存在模型变量food
// 等价于: SELECT * FROM `foods` WHERE (id = '2') LIMIT 1
db.Where("id = ?", 2).Take(&food)
// 修改food模型的值
food.Price = 100
// 等价于: UPDATE `foods` SET `title` = '可乐', `type` = '0', `price` = '100', `stock` = '26', `create_time` = '2018-11-06 11:12:04' WHERE `foods`.`id` = '2'
db.Save(&food)
更新单个字段值。
// 例子1:
// 更新food模型对应的表记录
// 等价于: UPDATE `foods` SET `price` = '25' WHERE `foods`.`id` = '2'
db.Model(&food).Update("price", 25)
// 通过 food 模型的主键 id 的值作为 where 条件,更新 price 字段值。
// 例子2:
// 上面的例子只是更新一条记录,如果我们要更全部记录怎么办?
// 等价于: UPDATE `foods` SET `price` = '25'
db.Model(&Food{}).Update("price", 25)
// 注意这里的 Model 参数,使用的是 Food{},新生成一个空白的模型变量,没有绑定任何记录。
// 因为 Food{} 的 id 为空,gorm库就不会以 id 作为条件,where 语句就是空的
//例子3:
//根据自定义条件更新记录,而不是根据主键 id
//等价于: UPDATE `foods` SET `price` = '25' WHERE (create_time > '2018-11-06 20:00:00')
db.Model(&Food{}).Where("create_time > ?", "2018-11-06 20:00:00").Update("price", 25)
更新多个字段值。
// 例子1:
// 通过结构体变量设置更新字段
updataFood := Food{
Price:120,
Title:"柠檬雪碧",
}
// 根据 food 模型更新数据库记录
// 等价于: UPDATE `foods` SET `price` = '120', `title` = '柠檬雪碧' WHERE `foods`.`id` = '2'
// Updates 会忽略掉 updataFood 结构体变量的零值字段, 所以生成的 sql 语句只有 price 和 title 字段。
db.Model(&food).Updates(&updataFood)
// 例子2:
// 根据自定义条件更新记录,而不是根据模型 id
updataFood := Food{
Stock:120,
Title:"柠檬雪碧",
}
// 设置 Where 条件,Model 参数绑定一个空的模型变量
// 等价于: UPDATE `foods` SET `stock` = '120', `title` = '柠檬雪碧' WHERE (price > '10')
db.Model(&Food{}).Where("price > ?", 10).Updates(&updataFood)
// 例子3:
// 如果想更新所有字段值,包括零值,就是不想忽略掉空值字段怎么办?
// 使用 map 类型,替代上面的结构体变量
// 定义 map 类型,key 为字符串,value 为 interface{} 类型,方便保存任意值
data := make(map[string]interface{})
data["stock"] = 0 //零值字段
data["price"] = 35
// 等价于: UPDATE `foods` SET `price` = '35', `stock` = '0' WHERE (id = '2')
db.Model(&Food{}).Where("id = ?", 2).Updates(data)
提示: 通过结构体变量更新字段值, gorm 库会忽略零值字段。就是字段值等于 0, nil, "", false 这些值会被忽略掉,不会更新。如果想更新零值,可以使用 map 类型替代结构体。
UPDATE foods SET stock = stock + 1 WHERE id = '2'
这样的带计算表达式的更新语句 gorm 怎么写?
gorm 提供了 Expr 函数用于设置表达式。
// 等价于: UPDATE `foods` SET `stock` = stock + 1 WHERE `foods`.`id` = '2'
db.Model(&food).Update("stock", gorm.Expr("stock + 1"))
删除模型数据一般用于删除之前查询出来的模型变量绑定的记录。Gorm 删除数据:Gorm 删除数据的语法:db.Delete(模型变量)。根据 Where 条件删除数据:Gorm 条件删除数据的语法:db.Where(条件表达式).Delete(空模型变量指针)。