ORM框架--GROM
简介
GORM是一个用于Go语言的数据模型ORM库,它基于SQL驱动,并提供了对象关系映射功能。
GORM具有以下特点:
- 自动数据库迁移:GORM支持自动生成数据库迁移文件,以实现数据库结构的自动更新。
- 快速查询:GORM支持使用Go的struct语法进行查询,简化了查询的开发过程。
- 灵活的查询构建:GORM支持使用表达式和函数构建复杂的查询条件。
- 事务处理:GORM支持事务处理,可以确保多个数据库操作的原子性。
- 性能优化:GORM针对Go的特性进行了优化,具有较高的性能。
安装
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
连接数据库
// 数据源
var dsn ="user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
user : 数据库的用户名
pass : 数据库密码
@tcp(127.0.0.1:3306) : tcp连接ip为127.0.0.1(本地)的3306端口的数据库
dbname :连接的数据库名
charset=utf8mb4 : 设置编码格式
parseTime=True :想要正确的处理 time.Time,需要带上 parseTime 参数
loc=Local : 表示使用当地时间
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
_ = db
}
表名 tbl_users
type TblUser struct {
Id int `gorm:"primaryKey"`
Name string
Age int
CreatTime time.Time `gorm:"index"`
}
创建数据
// 创建数据
user := TblUser{Name: "王一西", Age: 12, CreatTime: time.Now()}
result := db.Create(&user)
fmt.Println("新添加用户的ID ", user.Id) //新添加用户的ID 3
fmt.Println("返回的error ", result.Error) //返回的error <nil>
fmt.Println("插入记录条数", result.RowsAffected) //插入记录条数 1
批量插入
users := []TblUser{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
删除数据
user := TblUser{Id: 8}
db.Delete(&user) // DELETE FROM tbl_users where id = 8;
db.Delete(&TblUser{}, "8") // DELETE FROM tbl_users WHERE id = 8;
db.Delete(&TblUser{}, 8) // DELETE FROM tbl_users WHERE id = 8;
db.Delete(&TblUser{}, []int{1, 2, 3}) // DELETE FROM tbl_users WHERE id in (1,2,3);
db.Where("name = ?", "张三").Delete(&user) // DELETE FROM tbl_users where id = 10 AND name = "张三";
更新数据
// Save 会保存所有的字段,即使字段是零值
var user = TblUser{Id : 7,Name : "张三", CreatTime : time.Now()}
db.Save(&user)
// 单列 条件更新
db.Model(&TblUser{}).Where("Age = ?", 100).Update("Name", "hello1")
// UPDATE tbl_users SET name='hello' WHERE age=100;
// User 的 ID 是 `111`
db.Model(&user).Update("Name", "hello2")
// UPDATE tbl_users SET name='hello' WHERE id=7;
// 根据条件和 model 的值进行更新
db.Model(&user).Where("Age = ?", 100).Update("Name", "hello3")
// UPDATE tbl_users SET name='hello' WHERE id=7 AND active=true;
// 多列条件更新
// 根据 `struct` 更新属性,只会更新非零值的字段
db.Model(&user).Updates(TblUser{Name: "hello", Age: 18, CreatTime: time.Now()})
// 根据 `map` 更新属性
db.Model(&user).Updates(map[string]interface{}
{"Name": "hello5", "Age": 128, "CreatTime": time.Now()})
查询数据
简单查询
// 查询数据
user := TblUser{}
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM tbl_users ORDER BY id LIMIT 1;
// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM tbl_users LIMIT 1;
// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM tbl_users ORDER BY id DESC LIMIT 1;
result := db.First(&user)
fmt.Println(result.RowsAffected) // 返回找到的记录数
fmt.Println(result.Error) // returns error
// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)
主键查询
db.First(&user, 10)
// SELECT * FROM tbl_users WHERE id = 10;
db.First(&user, "10")
// SELECT * FROM tbl_users WHERE id = 10;
var users []TblUser
db.Find(&users, []int{1, 2, 3})
// SELECT * FROM tbl_users WHERE id IN (1,2,3);
条件查询
// 获取第一条匹配的记录
db.Where("name = ?", "赵四").First(&user)
// SELECT * FROM tbl_users WHERE name = '赵四' ORDER BY id LIMIT 1;
// 获取全部匹配的记录
db.Where("name <> ?", "赵四").Find(&users)
// SELECT * FROM tbl_users WHERE name <> '赵四';
// IN
db.Where("name IN ?", []string{"张三1", "张三2"}).Find(&users)
// SELECT * FROM tbl_users WHERE name IN ('张三1','张三2');
// LIKE
db.Where("name LIKE ?", "%张%").Find(&users)
// SELECT * FROM tbl_users WHERE name LIKE '%张%';
// AND
db.Where("name = ? AND age >= ?", "李四", "22").Find(&users)
// SELECT * FROM tbl_users WHERE name = '李四' AND age >= 22;
// Time
lastWeek := "2000-01-01 00:00:00"
db.Where("created_time > ?", lastWeek).Find(&users)
// SELECT * FROM tbl_users WHERE created_time > '2000-01-01 00:00:00';
// BETWEEN
today := "2000-01-08 00:00:00"
db.Where("created_time BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM tbl_users WHERE created_time BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';
总结:通过GROM框架,结构体能够自动和数据库表进行映射,能够自动进行驼峰映射。对于简单的SQL语句,GROM提供了很多CRUD接口,能够通过简单的设置创建数据库连接池。
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
能够在不写SQL语句的同时还可以防止数据注入等问题。