本内容总结自:字节跳动青年训练营 第五届后端组
Gorm简介
Gorm是一个全功能的ORM,负责的是承接Go语言对数据库的查询
Gorm的简单实例
首先安装相应的依赖
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
然后尝试一个简单的实例
package Grom
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
db, err := gorm.Open(mysql.Open(test.db), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 迁移schema
db.AutoMigrate(&Product{})
// 新建记录
db.Create(&Product{Code: "D42", Price: 100})
// 读操作
var product Product
db.First(&product, 1) // 根据整形主键查找
db.First(&product, "code=?", "D42") //查找code字段为D42的记录
// 更新操作
db.Model(&product).Update("Price", 200)
// Delete操作
db.Delete(&product, 1)
}
其中,使用gorm.Open选择打开数据库文件,注意需要指明使用的是何种数据库的驱动
接下来的CRUD操作就比较常规了,比如使用First函数寻找第一个符合查询条件的
Gorm目前支持MySql,SQLServer, PostgreSQL, SQLite,Gorm通过驱动来连接数据库。
Gorm创建数据
Gorm使用结构体定义数据,然后使用db.Create()方法将结构体的内容插入到数据库中。需要注意:结构体中的参数需要和数据库中的表的属性相一致
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user) // 通过数据的指针来创建
也可以选定字段来创建
db.Select("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775")
Gorm查询数据
1.检索单个对象
Gorm可以使用First(),Take(),Last()方法从数据库中检索单个对象,如果没有找到记录,他会返回ErrRecordNotFound错误。注意这些方法需要传入的是结构体的指针,比如
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
其中,First和Last函数会根据主键找到第一个和最后一个记录,它只在通过struct或者提供model值进行查询的时候才起作用
比如:
var user User
// 可以
DB.First(&user)
// SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1
// 可以
result := map[string]interface{}{}
DB.Model(&User{}).First(&result)
// SELECT * FROM `users` ORDER BY `users`.`id` LIMIT 1
// 不行
result := map[string]interface{}{}
DB.Table("users").First(&result)
// 但可以配合 Take 使用
result := map[string]interface{}{}
DB.Table("users").Take(&result)
2.根据主键检索
GORM允许通过内联条件指定主键来检索对象,但是只支持整形,因为string可能会导致sql注入
db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;
db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;
db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
3.检索对象
之前的First等只是检索一条对象,需要查询多个结果的时候可以使用Find函数
// 获取全部记录
result := db.Find(&users)
// SELECT * FROM users;
result.RowsAffected // 返回找到的记录数,相当于 `len(users)`
result.Error // returns error