一、设计模式之Databas/SQL与GORM实践
01、 理解database/sql
1.1 基本用法 - Quick Start
-
import driver
使用driver + DSN 初始化DB连接
import "github.com/go-sql-driver/mysql"
db, err := sql.Open("mysql", "user:passwor@tcp(127.0.0.1:3306)/hello")
DSN 代表数据源名称(Data Source Name)。DSN 是一个用于连接和配置数据库的标识符,它存储了连接数据库所需的信息,例如数据库的类型、位置、用户名、密码等。DSN 提供了一种简单的方法来管理数据库连接,而无需每次都提供完整的连接信息。
-
执行sql语句得到返回的数据存在rows中
完成后,释放连接
rows, err:= db.Query("select id, name from users where id = ?", 1)
if err != nil {
//xxx
}
defer rows.Close()
-
取数据
rows.Next()函数是用于遍历数据库查询结果的函数。它返回一个布尔值,表示是否存在下一行数据可供读取。rows.Scan()是一个用于将查询结果中的列值扫描到指定变量中的函数。它接受一系列参数,每个参数都是一个指向变量的指针,用于接收对应列的值。
var users []User
for rows.Next() {
var user User
err := rows.Scan(&user.ID, &user.Name)
if err != nil {
//...
}
users = append(users, user)
}
1.2 设计原理
02、 GORM基础使用
2.1 背景介绍
设计简洁、功能强大、自由扩展的全功能ORM
ORM 是对象关系映射(Object-Relational Mapping)的缩写,它是一种编程技术和模式,用于在面向对象的程序和关系型数据库之间建立映射关系。ORM 提供了一种抽象层,使开发人员可以使用面向对象的方式来操作数据库,而不必直接编写 SQL 查询语句。
2.2 基本用法 - CRUD
- 与1.1中写道的实例对比:
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
func main() {
db, err := gorm.Open(
mysql.Open("user:password@tcp(127.0.0.1:3306)/hello")
)
var users []User
err = db.Select("id", "name").Find(&users, 1).Error
}
2.2.1 增
// 操作数据库
db.AutoMigrate(&Product{})
db.Migrator().CreateTable(&Product{})
// 创建
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user)
user.ID //返回主键
result.Error
result.RowsAffected //返回影响的行数
// 批量创建
var users = []User{{Nmae: 1}, {Name: 2}, {Name: 3}}
db.Create(&user)
db.CreateInBatches(users, 100)
for _, user := range users {
user.ID //1,2,3
}
db.AutoMigrate(&Product{})是 GORM(Go的ORM库)中的一条语句,用于自动创建或更新数据库表结构以匹配给定的模型(Model)。
在这个语句中,db 是一个 GORM 的数据库连接对象,而 Product{} 是一个表示数据库模型的结构体。AutoMigrate() 方法会检查数据库中是否存在与给定模型对应的表,如果不存在,则会自动创建该表;如果存在,它会检查表结构是否与模型定义相匹配,并根据需要进行更新。
-
db.Migrator().CreateTable(&Product{})是 GORM(Go的ORM库)中用于创建数据库表的方法。方法会根据给定的模型定义创建相应的数据库表。 -
db.Create()是 GORM(Go的ORM库)中用于将对象插入到数据库中的方法。 -
db.CreateInBatches()是 GORM(Go的ORM库)中用于批量插入数据到数据库的方法。
2.2.2 查
// 读取
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
-
db.First()是 GORM(Go的ORM库)中用于查询数据库中符合条件的第一条记录的方法。 -
db.Find()是 GORM(Go的ORM库)中用于查询数据库中符合条件的多条记录的方法。Find()方法返回的结果是一个 GORM 的*DB对象,而不是查询结果本身。实际的查询结果存储在users切片中。
2.2.3 改
// 更新某个字段
db.Model(&product).Update("Price", 2000)
db.Model(&product).UpdateColumn("Price", 2000)
// 更新多个字段
db.Model(&product).Updates(Product{"price": 2000, "Code": "L1212"})
// 批量更新
db.Model(&Product{}).Where("price < ? ", 2000).Updates(map[string]interface{}{"Price": 2000})
Update()方法会触发模型的钩子函数、自动更新字段,并对其他字段进行验证。它更适用于全面的记录更新操作。UpdateColumn()方法直接更新指定的字段的值,不会触发钩子函数和自动更新字段,也不会验证其他字段。它适用于只需更新指定字段的情况,且不需要进行其他处理。
2.2.4 删
db.Delete(&product)
2.3 模型定义-惯例约定
- ID/Id 字段为主键,如果为数字,则为自增主键
- CreatedAt字段,创建时,保存当前时间
- UpdatedAt字段,创建、更新时,保存当前时间
- gorm.DeletedAt字段,默认开启soft delete模式