数据库/SQL与GORM设计与实践|青训营笔记

146 阅读1分钟

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

  • database/SQL
    • 基本用法
    import(
        "database/sql"
       _ "github.com/go-sql-driver/mysql"
    )
    func main(){
        // 使用driver+DSN初始化DB连接
        db, err := sql.Open("mysql","user:password@tcp(127.0.0.1:3306)/hello")
        // 写法2
        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)
        // 执行sql语句,通过rows取出返回的数据
        rows, err := db.Query("select id, name from users where 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)
        }
        if rows.Err() != nil{}
    }
    
    • 设计原理
      • DB连接类型
        • 直接连接/Conn
        • 预编译/Stmt
        • 事物/Tx
      • 返回处理数据方式
        • Exec/ExecContext->Result
        • Query/QueryContext->Rows(Columns)
        • QueryRow/QueryRowContext->Row(Rows简化)
  • GORM简单使用
    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
    }
    
    • 基础用法:CRUD
    //操作数据库
    db.AutoMigrate(&Product{})
    db.Migrator().CreateTable(&Product{})
    //创建
    user := User{Name:"name",Age:18}
    result := db.Create(&user)
    //批量创建
    var users = []User{{Name:"name1"},{Name:"name2"}}
    db.Ceate(&users)
    db.CreateInBatches(users,100)
    //读取
    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  //返回找到的记录数
    errors.Is(result.Error,gorm.ErrRecordNotFount)
    //更新字段
    db.Model(&product).Update("Price",2000)
    db.Model(&product).UpdateColumn("Price",2000)
    //更新多个字段
    db.Model(&product).Update(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})
    //删除
    db.Delete(&product)
    
    • 模型定义原则
  • GORM设计原理
    • SQL生成 db.Where("role<>?","manager").Where("age>?",35).Limit(100).Order("age desc").Find(&user)
    • 插件扩展
    • ConnPool
    • Dialector
  • 这节课感觉云里雾里,感觉什么都是浅尝即止,不成体系