DATABASE/SQL及GORM相关解读 | 青训营笔记

80 阅读1分钟

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

此笔记的主要内容如下

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

理解database/sql

基本用法

import driver 实现

import (
    "database/sql"
    "github.com/go-sql-driver/mysql"
)

使用 driver + DSN 初始化DB连接

db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")

执行一条SQL语句,通过rows取回返回的数据处理完毕,需要释放链接

rows, err := db.Query("select id, name from users where id = ?", 1)
if err != nil {

}
defer rows.Close()

注意,处理完返回的数据后要及时Close(),释放链接,否则可能造成资源泄露

将取出的数据放入User字段中

var users []User
for rows.Next() { // Next()不断取出rows的下一条数据
    var user User
    err := rows.Scan(&user.ID, &user.Name)
    
    if err != nil {
    }
    
    users.append(users, user)
}

处理错误

if rows.Err() != nil {

}
设计原理

image.png

GORM基础使用

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

基本用法
import (
    "gorm.io/gorm"
    "gorm.io/driver/mysql"
)

db, err := gorm.Open(mysql.Open("user:password@tcp(127.0.0.1:3306)/hello"))

CRUD 创建

user := User{Name: "Zhangsan", Age: 18, Birthday: time.Now()}
result := db.Create(&user)

user.ID //返回主键最后一个插入id
result.RowsAffected // 返回影响的记录数

批量创建

var users = []User{{Name: "Zhangsan"}, {Name: "Lisi"}}
db.Create(&users)

读取

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

result := db.Find(&users, []int{1,2,3})
result.RowsAffected

更新某个字段

db.Model(&product).Update("Price", 2000)
db.Model(&product).UpdateColumn("Price", 2000)

更新多个字段

db.Model(&product).Updates(Prodect{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})

删除

db.Delete(&product)
模型定义

惯例约定

约定优于配置

  • 表名为 结构名 的 snake_cases 复数格式
  • 字段名为 field name 的 snake_case 单数格式
关联介绍

CRUD

关联模式

longAssociation := db.Model(&user).Association("languages")
// 查询
longAssociation.Find()
// 添加
longAssociation.Append()
// 替换
longAssociation.Replace()
// 删除
longAssociation.Delete()
// 清除
longAssociation.Clear()
// 计数
longAssociation.Count()

级联删除

// 删除 user 时,也删除 user 的 account
db.Select("Account").Delete(&user)

// 删除 user 时,也删除 user 的 所有依赖项
db.Select(clause.Associations).Delete(&user)

GORM设计原理

image.png

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

等价于

db.Where("role <> ?", "manager").Where("age > ?", 35).Limit(100).Order("age desc").Find(&user)