这是我参与「第五届青训营 」伴学笔记创作活动的第5天,在过去几天,我学习了go语言框架三件套,即Gorm,Kitex以及Hertz
Gorm的基础使用
- Gorm的详细内容见 gorm.cn/zh_CN/docs/…
Gorm的模型定义
- GORM 倾向于约定,而不是配置。
- GORM 使用
ID作为主键 - 使用结构体名的
蛇形复数作为表名,字段名的蛇形作为列名 - 使用
CreatedAt、UpdatedAt字段追踪创建、更新时间 - GORM 定义一个
gorm.Model结构体,其包括字段ID、CreatedAt、UpdatedAt、DeletedAt
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
Gorm连接数据库
- GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
Gorm创建数据
- 创建记录
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user) // 通过数据的指针来创建
user.ID // 返回插入数据的主键
result.Error // 返回 error result.RowsAffected // 返回插入记录的条数
- 用选定字段的来创建
db.Select("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775")
- 创建时排除选定字段
db.Omit("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775")
- 创建钩子
GORM 允许 BeforeSave, BeforeCreate, AfterSave, AfterCreate 等钩子,创建记录时会调用这些方法, 详情请参阅 钩子
func (u *User) BeforeCreate(tx *gorm.DB) (err error) { u.UUID = uuid.New() if u.Role == "admin" { return errors.New("invalid role") } return }
- 批量插入
将切片数据传递给 Create 方法,GORM 将生成一个单一的 SQL 语句来插入所有数据,并回填主键的值,钩子方法也会被调用。
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} DB.Create(&users) for _, user := range users { user.ID // 1,2,3 }
- Upsert 和 Create With Associations 也支持批量插入