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 "%罗%";