前言
这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
今日学习内容:
- 理解 database/sql
- GORM 使用简介
- GORM 设计原理
- GORM 最佳实践
正文
理解 database/sql
- 基本用法
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{
//...
}
- 设计原理
GORM 基础使用
GORM 是一款设计简洁、功能强大、自由扩展的全功能 ORM 框架
- 设计原则:API精简、测试优先、最小惊讶、灵活扩展、无依赖 可信赖
- 功能完善:
- 关联:一对一、一对多、单表自关联、多态;Preload、Joins 预加载、级联删除;关联模式;自定义关联表
- 事务:事务代码块、嵌套事务、Save Point
- 多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、SQL表达式(查询、创建、更新)、自动选字段、查询优化器
- 字段权限、软删除、批量数据处理、Prepared Stmt、自定义类型、命名策略、虚拟字段、自动 track 时间、SQL Builder、Logger
- 代码生成、复合主键、Constraint、Prometheus、Auto Migration、真·跨数据库兼容...
- 多模式灵活自由扩展
- 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)
-
模型定义的惯例约定
-
关联