初步认识GORM | 青训营笔记

157 阅读2分钟

初步认识GORM | 青训营笔记

这是我参与「第三届青训营-后端场」笔记创作活动的的第5篇笔记

1.GORM基础使用

基本用法,Model定义,惯例约定,关联操作

2.背景知识

设计简洁、功能强大、自由扩展的全功能ORM

  • 设计原则: API精简、测试优先、最小惊讶、灵活扩展、无依赖可信赖

  • 功能完善:

    • 关联:一对一、一对多、单表自关联、多态;Preload、 Joins 预加载、级联删除;关联模式;自定义关联表
    • 事务:事务代码块、嵌套事务、Save Point
    • 多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、SQL表达式(查询、创建、更新)、自动选字段、查询优化器
    • 字段权限、软删除、批量数据处理、Prepared Stmt、自定义类型、命名策略、虚拟字段、自动track时间、SQL Builder、Logger
    • 代码生成、复合主键、Constraint、 Prometheus、 Auto Migration、真跨数据库兼容...
    • 多模式灵活自由扩展
    • Developer Friendly

3.模型定义-惯例约定

约定优于配置

  • 表名为struct name的snake_ cases复数格式
  • 字段名为field name的snake_ case单数格式
  • ID/ ld字段为主键,如果为数字,则为自增主键
  • CreatedAt字段,创建时,保存当前时间
  • UpdatedAt字段,创建、更新时,保存当前时间
  • gorm.DeletedAt字段,默认开启soft delete模式

一切皆可配置:gorm.io/docs/conven…

package main

// gorm demo2
import (
	"database/sql"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"time"
)

// 定义模型
type User struct {
	gorm.Model   // 内嵌gorm.Model
	Name         string
	Age          sql.NullInt64 `gorm:"column:user_age"` // 零值类型
	Birthday     *time.Time
	Email        string  `gorm:"type:varchar(120);unique_index"`
	Role         string  `gorm:"size:255"`        // 设置字段大小为255
	MemberNumber *string `gorm:"unique;not null"` // 设置会员号(member number)唯一并且不为空
	Num          int     `gorm:"AUTO_INCREMENT"`  // 设置 num 为自增类型
	Address      string  `gorm:"index:addr"`      // 给address字段创建名为addr的索引
	IgnoreMe     int     `gorm:"-"`               // 忽略本字段
}

// 使用`AnimalID`作为主键
type Animal struct {
	AnimalID int64 `gorm:"primary_key"`
	Name     string
	Age      int64
}

// 唯一指定表名
func (Animal) TableName() string {
	return "qimi"
}

func main() {
	// 修改默认的表明规则
	gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
		return "SMS_" + defaultTableName
	}
	// 连接MySQL数据库
	db, err := gorm.Open("mysql", "root:root1234@(127.0.0.1:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()
	db.SingularTable(true) // 禁用复数

	db.AutoMigrate(&User{})
	db.AutoMigrate(&Animal{})

	// 使用User结构体创建名叫 xiaowangzi 的表
	//db.Table("xiaowangzi").CreateTable(&User{})
}

4.GORM最佳实践

  1. 数据序列化与SQL表达式

  2. 批量数据操作

  3. 代码复用、分库分表、Sharding

  4. 混沌工程/压测

  5. Logger/ Trace

  6. Migrator

  7. Gen代码生成/ Raw SQL

  8. 安全