这是我参加 第五届青训营 伴学笔记创作活动的第3天
什么是GORM?
基于golang的ORM框架,针对常用场景/功能进行封装,同时支持多种数据库(MySql,PostgreSQL,SQlite,SQL Server)以及比如事务等高级用法.
这篇文章也是我在学习gorm的时候所写,所以只涉及gorm的基础使用(增删改查等),如果想了解gorm的高级特性请去官方文档查询(或者相关高star开源库学习).
进行GORM相关操作需要两个最基本的对象:
- struct结构,对应数据库中的表
- DB对象,负责控制整个GORM
基础使用
安装GORM
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql(mysql驱动)
创建 数据库结构体
由表结构我们可以创建以下struct:
type User struct{
UserId string
UserName string
UserPassword string
Email String
CreateDate time.Time
PhoneNumber string
}
func (u User) TableName() string {
return "user"
}
上述结构等价于->
type UserEmbedded struct {
Id string
Name string
Password string
Email string
}
type User struct {
UserEmbedded `gorm:"embedded;embeddedPrefix:user_"`
CreateDate time.Time
PhoneNumber string
}
第二种创建结构体的方法通过添加tag标签,可以向最初的结构体嵌入结构体,同时可以对嵌入的结构体属性在转换时添加通用的前缀(比如user_). 通过定义TableName函数,可以自定义结构体对象对应的数据库表名.
以下是常见的几种增删改查操作:
(插入/批量插入)对象
func main() {
dsn := "root:123456@tcp(127.0.0.1:3306)/douyin_simplified"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
user := User{}
user.UserId = "this is a test"
user.UserName = "test"
// 插入单条数据
db.Select("user_id", "user_name").Create(&user)
//批量插入
users := []User{}
for i := 0; i < 10; i++ {
var tmp User
tmp.Id = user.Id + strconv.Itoa(i)
tmp.Name = "test"
users = append(users, tmp)
}
db.Select("user_id", "user_name").Create(&users)
}
查询
db.First(&user)//获取数据库中第一条数据
//随机获取数据
db.Take(&user)
// SELECT * FROM users LIMIT 1;
var users []User
db.Find(&users)//获取所有数据
// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
更新
通过gorm提供的Update函数以及对应的条件函数(Where Select等)可以对数据进行更新操作.
db.Model(&user).Update("user_phone","123456")
当然也可以通过定义map[string]interface{}对象对数据进行批量更新
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})//来自官网案例
注意:gorm支持链式操作,但是条件函数需要记得放在真正的操作函数之前!
user.Select(...).Where(...).Where(...)...Update()
删除
通过调用Delete可以对数据库进行删除操作
db.Delete(&user)
db.Where(...).Delete(&user)