gorm 基础学习 | 青训营笔记

76 阅读2分钟

这是我参加 第五届青训营 伴学笔记创作活动的第3天

什么是GORM?

基于golang的ORM框架,针对常用场景/功能进行封装,同时支持多种数据库(MySql,PostgreSQL,SQlite,SQL Server)以及比如事务等高级用法.

官方文档地址

代码仓库地址

这篇文章也是我在学习gorm的时候所写,所以只涉及gorm的基础使用(增删改查等),如果想了解gorm的高级特性请去官方文档查询(或者相关高star开源库学习).

进行GORM相关操作需要两个最基本的对象:

  1. struct结构,对应数据库中的表
  2. DB对象,负责控制整个GORM

基础使用

安装GORM


go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql(mysql驱动)

创建 数据库结构体

image.png

由表结构我们可以创建以下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)
    }

image.png 查询

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)