这是我参与「第五届青训营」伴学笔记创作活动的第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来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。