Go --- gorm 简单的增删操作

Gorm是什么

Gorm是一个Golang ORM库

其中:

ORM(object/Relation Mapping),对象/关系映射,关系型数据库映射成对象,是一种为了帮助程序员用面对对象的思想来操作数据库为目的而被设计的。

简单使用

这里说一下,gorm有两种导入方式

“github.com/jinzhu/gorm”

“gorm.io/gorm”

两个包都是gorm,只是版本不同,所以有些方法也不同,这里使用的"gorm.io/gorm"这个包

连接数据库

连接数据库,这里以mysql为例

// 导入
// "gorm.io/driver/mysql"
// "gorm.io/gorm"
// gorm.Open(mysql.Open(dsn), &gorm.Config{})
db, err := gorm.Open(mysql.Open(fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
        utils.DatabaseSetting.User,
        utils.DatabaseSetting.Password,
        utils.DatabaseSetting.Host,
        utils.DatabaseSetting.Name)),
        &gorm.Config{
})
if err != nil {
        fmt.Println("\n",err)
        fmt.Println("连接数据库失败")
}

配置数据库连接池

// 设置数据库连接池
// GORM 使用 database/sql 维护连接池
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)

注册模型

gorm官方定义的model

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

写一个嵌套着官方模型的model

// User 简单的用户模型
type User struct {
	gorm.Model

	Username string	`json:"username"`
	Password string	`json:"password"`
}

注册模型

// 注册模型
err = db.AutoMigrate(&models.User{})
if err != nil {
    fmt.Println(err)
    fmt.Println("注册模型失败")
}

CRUD

不演示原生SQL和SQL生成器

特别注意:gorm中的条件会遗传给下一个SQL语句

1.根据结构体传值插入

// 第一种 根据结构体传值插入
u := models.User{Username: "张三", Password: "123"}
create := db.Create(&u)
 用户id
id := u.ID
fmt.Println("用户id =",id)
 返回错误信息
err = create.Error
if err != nil {
	fmt.Println(err)
	fmt.Println("插入信息出错")
}

2.根据给定字段插入

// 第二种 根据给定字段插入
// 1.创建记录并更新给出的字段。
db.Select("UserName").Create(&models.User{Username: "张三",Password: "123"})
// INSERT INTO `users` (`UserName`) VALUES ("张三")
// 2.创建一个记录且一同忽略传递给略去的字段值。
db.Omit("Password").Create(&models.User{Username: "张三",Password: "123"})
// INSERT INTO `users` (`UserName`,`updated_at`,`created_at`) VALUES ("张三","2022-03-05 00:00:00.000", "2022-03-05 00:00:00.000")

3.批量插入

// 第三种 批量插入
var users = []models.User{{Username: "张三"}, {Username: "李四"}, {Username: "王五"}}
db.Create(&users)
for i, user := range users {
	id := user.ID
	fmt.Println("用户",i,"的id =",id)
}

或者 分批创建并指定每批数量

// 或者 分批创建并指定每批数量
var users = []models.User{{Username: "张三"}, ...., {Username: "李四"}}
// 设定每批数量为 100
db.CreateInBatches(users, 100)

简单查询

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// 随机查询一条数据
result := db.Limit(1).Find(&user)
// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

根据主键查询

// 根据主键查询(主键是数字类型)
db.First(&user,1)
// SELECT * FROM users WHERE id = 1;
db.First(&user,"1")
// SELECT * FROM users WHERE id = 1;
// 根据主键查询(主键是string类型,就像uuid)
db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
// SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";

批量查询

// 查询给定信息的数据
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
// 查询所有数据
result := db.Find(&users)
// 查询的条数
count := result.RowsAffected
fmt.Println("共有",count,"条数据")

条件查询

// 条件查询
db.Where("name = ?", "张三").First(&user)
// SELECT * FROM users WHERE name = '张三' ORDER BY id LIMIT 1;
// 获取所有满足条件的信息
db.Where("name <> ?", "张三").Find(&users)
// SELECT * FROM users WHERE name <> '张三';
// 也可以根据结构体实现条件查询
db.Where(&models.User{Username: "张三",Password: "123"}).First(&user)
// SELECT * FROM users WHERE username = "张三" AND password = "123" ORDER BY id LIMIT 1;
// 内联条件
db.Find(&user, "username = ?", "张三")
// SELECT * FROM users WHERE username = "张三";
db.Find(&users, "username <> ?", "张三")
// SELECT * FROM users WHERE username <> "张三";

更改单列

user.ID = 1
db.Model(&user).Update("username", "加油吧")
// UPDATE users SET username='加油吧', updated_at='2022-3-6 21:34:10' WHERE id=1;

条件更改

db.Model(&models.User{}).Where("username = ?", "张三").Update("username", "努力吧")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;

批量更改

// 根据 struct 更新
db.Model(models.User{}).Where("username = ?", "张三").Updates(models.User{Username: "罗翔", Password: "abc"})
// UPDATE users SET username='罗翔', Password='abc' WHERE username = '张三';

使用 struct 删除时,需要该 struct 有主键,不然会批量删除

user.ID = 1
db.Delete(&user)
// DELETE from users where id = 1;

根据主键删除

db.Delete(&models.User{},2)
db.Delete(&models.User{},"3")

批量删除

db.Where("username LIKE ?", "%罗%").Delete(&models.User{})
// DELETE from emails where username LIKE "%罗%";
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

吕元龙的小屋

你的鼓励是我继续掉头发的动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值