[ 设计模式之Databas/SQL与GORM实践 | 青训营笔记 ]

58 阅读4分钟

一、设计模式之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 设计原理

22.png

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模式