DATABASE/SQL 与 GORM 设计与实践 | 青训营笔记

133 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记。

1.database/sql

基本用法

import (
    "database/sql"//这个包里有连接池,一些接口用于连接数据库和操作数据库
    _"github.com/go-sql-driver/mysql"
)

func main(){
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")  //使用driver+DSN初始化DB连接
    rows, err := db.Query("select id, name from users where id = ?", 1)  //执行sql
    if err != nil{
    //xxx
    }
    //处理完毕,释放资源,虽然rows.Next最后会释放,但是担心在rows.Scan中有异常导致资源泄漏
    defer func(){ 
        err = rows.Close() 
    }
    
    //处理获得的数据
    var users []User
    for rows.Next(){ //不断获得下一条数据
        vae user User
        err := rows.Scan(&user.ID, &user.Name)  //从rows中提取
        
        if errr != nil{
            // ...
        }
        
        users = append(users, user)  //加到user
    }
    
    if rows.Err() != nil{
    //...
    }
    
    //早年的用法:注册全局Driver,是一个连接接口
    func init(){
    sql.Register("mysql", &MySQLDriver{})
    }
}

基本原理

image.png

连接接口:注册driver

//早年写法,语义不清晰,容易忘记import driver
db, err := sql.Open( 
    mysql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello") 
)
//更好的写法,使用结构体,使每个字段的含义更清晰,而且会自动import driver
connector, err := mysql.NewConnector(&mysql.Config{
    User:        "gorm",
    Passwd:      "gorm",
    Net:         "tcp",
    Addr:        "127.0.0.1:3306",
    DBName:      "gorm",
    ParseTime:    true,
})
db := sql.OpenDB(connector)

操作接口

image.png

image.png

基本crud操作见Database/SQL与GORM实践

2.GORM使用简介

设计简洁、功能强大、自由拓展的全功能 ORM(对象关系映射),自动import driver和close释放资源

基本用法

建立driver

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

select 操作

var user User
err = db.Select("id","name").Find(&users, 1).Error

image.png

image.png

模型定义

image.png

下面是一些惯例约定:

  • 表名是 stuct name 的复数格式
  • 字段名是field name 的单数格式
  • ID / Id 字段为主键,如果是数字,则为自增主键
  • CreatedAt 字段,创建时保存当前时间
  • UpdatedAt 字段,创建、更新时保存当前时间
  • DeletedAt 字段,默认开启 soft delete 模式

关联介绍

image.png image.png image.png image.png

3.GORM设计原理

SELECT * FROM user WHERE role <> "manager" AND age > 35 ORDER BY age desc LIMIT 100

使用GORM可以代替为

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

GORM STATEMENT 由 GORM Clauses 和 Finisher Method来构成

其中 GORM Clauses 包括了多个 Chain Method

执行流程:Finisher Method => 决定 Statement 类型 => 执行 Callbacks => 生成 SQL 并执行

4.GORM最佳实践