这是我参与「第五届青训营 」伴学笔记创作活动的第 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 {
}
设计原理
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设计原理
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)