GO框架三件套 | 青训营笔记

55 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第6天

Gorm基本使用

定义model

// 结构体字段与表字段相对应
type User struct {
    ID int64
    Name string
    Age int64
}
// 表名
func (u User) TableName() {
    return "user"
}

连接数据库

    dsn := "root:pwd@tcp(127.0.0.1:3306)/dbname?charest=utf8mb4&parseTime=ture&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("connect to db err:", err)
    }

CURD

    // 创建
    db.Create(&User{Name: "xm", Age: 20})
    
    // 查询
    var u User
    db.First(&u, 1)   // 根据主键
    db.First(&u, "name = ?", "xm")   // 查name为xm的记录
    
    // 更新
    db.Model(&u).Update("Age", 21)  // u有id,被用于构建条件
    db.Model(&User{}).Where("ID = ?", 1).Upadate("Age", 22)  // 条件更新
    
    // 删除
    db.Delete(&User{}, 1)    // 删除主键为1
    db.Delete(&u)    // u.ID=1,删除主键为1

注意

查询

First查询不到返回ErrRecordNotFound

Find查询不到不会返回错误

更新

根据struct更新,只会更新非零值

若要更新零值,可以用map[string]interface{},或者Select选择字段

删除

db.Delete一般是物理删除,若结构体里有Deleted gorm.DeleteAt 字段,调用Delete时是软删

使用Unscoped可以查询到被软删的数据

事务

    tx := db.Begin()
    if err := tx.Create(&User{Name:"xm"}); err != nil {
        tx.Rollback()
        return
    }
    if err := tx.Model(&User{ID: 1}).Update("Name": "xl"); err != nil {
        tx.Rollback()
        return
    }
    tx.Commit()

性能提高

  • Gorm默认为写操作开启了事务,保证数据的完整性,但是会降低性能,可以在初始化数据库时关闭
  • 使用PrepareStmt预编译语句可以提高后续的调用速度
    db, err := gorm.Open(mysql.Open(dsn),
        &gorm.Config{
            SkipDefaultTransaction: true,  // 关闭默认事务
            PrepareStmt: true,   // 缓存编译语句
        }
    )

Kitex

定义IDL

如果我们要进行RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。这时候,就需要通过DL来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。

image.png