GORM设计原理与实践|青训营笔记

122 阅读2分钟

关于GORM的发展过程

GORM 项目初衷与发展历程 GORM 最开始源于 2013 年,当时在做一个支付系统,当时 Golang 的生态圈不够成熟,没找到符合自己需求的库,然后拼 SQL 拼烦了,然后自己花了一个周未的时间做了第一版,帮项目顺利上线。

GORM的优越设计理念 GORM 遵从了 API 精简,测试优先,最小惊讶,自由组合扩展,无依赖的设计理论,争做一个健壮的可信赖的开源产品。

GORM 项目在字节跳动内部的实践应用 GORM 在字节跳动的应用很广泛,公司内部社群比 GORM 所有的微信群加起来的人数多的多,现在广泛应用在字节跳动的上万个 Go 的微服务当中

GORM的设计原理图

image.png

SQL是怎么生成的

SQL语句例子:

SELECT `name`, `age `, `employee_number'
FROM `users'
WHERE
`role` > "manager" AND `age` > 35
ORDER BY `age` DESC
LIMIT 10 OFFSET 10
FOR UPDATE

GROM配置

开启go model

开启go mod
go env -w GO111MODULE=on
这个命令会在当前目录创建一个名为go.mod的文件, 在本文中不会修改它的内容
go mod init huzhenwei.top/utils

设置go model

go env 最后找到:GOPROXY

image.png

输入代理:

image.png

导入依赖:

go get github.com/jinzhu/gorm
go get github.com/jinzhu/gorm/dialects/mysql

查看go.sum文件是否导入成功

image.png

初步体验GROM操作

1、结构体映射建立数据库表

2、插入一条数据

package main

import (
   "fmt"
   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
   "log"
   "time"
)

// Info  结构体名、变量名一定要使用大驼峰命名法(每个单词首字母大写)
type Info struct {
   gorm.Model
   Name string
}

func main() {
   db, err := gorm.Open("mysql", "root:XXXXXXX@tcp(127.0.0.1:3306)/mybatis?charset=utf8mb4&parseTime=True&loc=Local")
   if err != nil {
      log.Print(err)
   }
   // 结构体映射成为数据库表
   migrate := db.AutoMigrate(&Info{})
   if migrate.Error != nil {
      fmt.Println(migrate.Error)
   }
   model := gorm.Model{
      CreatedAt: time.Time{},
      UpdatedAt: time.Time{},
      DeletedAt: nil,
   }
   info := Info{model, "小黄"}
   // 插入数据
   db.Create(&info)
   fmt.Println("ok")
   // 关闭数据库连接
   defer func(db *gorm.DB) {
      err := db.Close()
      if err != nil {
         log.Println(err)
      }
   }(db)
}