Database/sql 及 GORM 相关解读| 青训营笔记

53 阅读2分钟

前言

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天 

今日学习内容:

  • 理解 database/sql
  • GORM 使用简介
  • GORM 设计原理
  • GORM 最佳实践

正文

理解 database/sql

  1. 基本用法
import (
"database/sql"
"github.com/go-sql-driver/mysql"
)
func main() {
    // 使用 driver + DSN 初始化 DB 连接
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello") 
    // 执行 SQL,处理完毕,需要释放连接
    rows, err := db.Query("select id, name from users where id = ?",1) 
    if err != nil {
    // xxx 
    }
    defer func() { 
        err = rows.Close()
    }
    var users User 
    for rows.Next(){ 
        var user User
        err:= rows.Scan(&user.ID,&user.Name) 
        if err != nil {
          //...
        }
        users = append(users, user) 
    }
    if rows.Err() != nil{ 
        //...
    }  
  1. 设计原理

image.png

image.png

GORM 基础使用

GORM 是一款设计简洁、功能强大、自由扩展的全功能 ORM 框架

  • 设计原则:API精简、测试优先、最小惊讶、灵活扩展、无依赖 可信赖
  • 功能完善:
    • 关联:一对一、一对多、单表自关联、多态;Preload、Joins 预加载、级联删除;关联模式;自定义关联表
    • 事务:事务代码块、嵌套事务、Save Point
    • 多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、SQL表达式(查询、创建、更新)、自动选字段、查询优化器
    • 字段权限、软删除、批量数据处理、Prepared Stmt、自定义类型、命名策略、虚拟字段、自动 track 时间、SQL Builder、Logger
    • 代码生成、复合主键、Constraint、Prometheus、Auto Migration、真·跨数据库兼容...
    • 多模式灵活自由扩展
  1. CRUD 基本用法
//操作数据库
db.AutoMigrate(&Product{})
db.Migrator().CreateTable(&Product{})
//https://gorm.io/docs/migration.html
//版本管理- https://github.com/go-gormigrate/gormigrate

// 创建
user := User{Name: "Jinzhu",Age:18,Birthday: time.Now()} result := db.Create(&user) // pass pointer of data to Create

user.ID //返回主键 last insert id
result.Error //返回 error 
result.RowsAffected //返回影响的行数 

//批量创建
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} 
db.Create(&users)
db.CreateInBatches(users, 100) 

for _, user := range users {
    user.ID //1,2,3 
} 

// 读取
var product Product 
db.First(&product,1) // 查询id为1的product
db.First(&product,"code = ?","L1212") // 查询code为L1212的product

result := db.Find(&users,[]int{1,2,3})
result.RowsAffected //返回找到的记录数
errors.Is(result.Error, gorm.ErrRecordNotFound) // First,Last,Take 查不到数据

// 更新某个字段
db.Model(&product).Update("Price", 2000)
db.Model(&product).UpdateColumn("Price", 2000)

//更新多个字段
db.Model(&product).Updates(Product{Price: 2000, Code: "L1212"})
db.Model(&product).Updates(map[string]interface{}{"Price": 2000, "Code": "L1212"}) 

//批量更新
db.Model(&Product{}).Where("price < ?", 2000).Updates(map[string]interface{}{"Price": 2000}) 

// 删除 - 删除product
db.Delete(&product)
  1. 模型定义的惯例约定

  2. 关联

GORM 设计原理

GORM 最佳实践