设计模式之 database sql与 GORM实践 | 青训营笔记

90 阅读2分钟

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

1. 理解database/mysql

1.1 基本用法 - Quick start

  1. import driver实现 使用driver + DSN初始化DB连接
    func main(){
        db,err := sql.Open("mysql","user:password@tcp(127.0.0.1:3306)/hello")
    
  2. 执行一条SQL,通过rows取回返回的数据,处理完毕,需要释放链接
    rows,err := db.Query("select id,name from users where id = ?",1)
    if err != nil{
        // xxx
    }
    defer rows.Close()
    
  3. 数据、错误处理
    var users []User
    for rows.Next(){
        var user User
        err := rows.Scan(&user.ID,&user.Name)
        
        if err != nil{
            // ...
        }
        
        users = append(users,user)
    }
    
    错误处理
    if rows.Err() != nil{
        // ...
    }
    

1.2 设计原理

image.png

image.png

2. GORM基础使用

2.1 基本用法

功能完善:

  • 关联:一对一、一对多、单表自关联、多态;Preload、Joins 预加载、级联删除;关联模式;自定义关联表
  • 事务:事务代码块、嵌套事务、Save Point
  • 多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、SQL表达式(查询、创建、更新)、自动选字段、查询优化器
  • 字段权限、软删除、批量数据处理、Prepared Stmt、自定义类型、命名策略、虚拟字段、自动 track 时间、SQL Builder、Logger
  • 代码生成、复合主键、Constraint、Prometheus、Auto Migration、真·跨数据库兼容...
  • 多模式灵活自由扩展
  • Developer Friendly

CRUD

//读取
var product Product
db.First(&product,1) //查询id为1的product 
db.FirstC&product,"code=?""L1212")// 查询code为L1212的product
result := db.Find(&users, Dint{1,2 3}) result.RowsAffected//返回找到的记录数
errors.Is(result.Error,gorm.ErrRecordNotFound)// First,Last,Take 查不到数据
// 更新某个字段
db.Model(&product).Update("Price"2000)
字节跳云
db.Model(&product).UpdateColumn("Price"2000)
//更新多个字段
db.Model(&product).Updates(Product{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}
//删除-删除product db.Delete &product)

模型定义 - 惯例约定

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