ByteCamp - Note 5 DataBase/Gorm

165 阅读1分钟

import(
    "datanase/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main(){
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")
    
    rows, err := db.Query("select id", 1)
    
    if err != nil{
     ...
    }
    
    defer 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)
    }
    
    // 一个容易被遗漏的err
    if rows.Err() != nil{
        ...
    }

}

连接池配置 连接池状态: 从连接池获取链接或通过driver新建连接\

db, err := sql.Open("mysql", "gorm:gorm@tcp(localhost:99 ... ")

dfn字符串很长,可读性大,转义困难 \

2017年 传入interface,新的连接接口

DB连接的几种类型

  • Conn直接连接:tcp
  • Stmt预编译:传递reference id,对于相同的查询传递一样的,减少网络传输和分析语句的时间
  • Tx事物

返回数据的几种方式

  • Exec/ExecContext -> Result
  • Query/ QueryContext -> Row
  • QueryRow/ QueryRowContext -> Row(简化)

GORM基础使用

全功能ORM - 磨刀不误砍柴工 Don't repeat yourself

gorm.io/docs/

见文档

Gorm 设计原理

如何通过一行配置加快服务性能?

SQL生成

应用程序 -> GORM --操作接口--> database/sql

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

Finisher Method 决定类型/执行
Find -> Select
Create -> insert
Update -> update

根据当前的Finisher确定最终的sql

拓展子句

hints.UseInext()
hits.ForceIndex()

插件拓展

预定义Create callbacks,执行Create过程,一次调用注册的Create Callbacks

ConnPool

db conn 实现 connPool,读写分离

Dialector