day 12

71 阅读2分钟

Go语言三件套

Gorm,kitex,hertz

Gorm gorm是Golang语言中一个已经迭代数十年且功能强大、性能极好的ORM框架

ORM:Object Relational Mapping(对象关系映射),其主要作用是在编程中,把面向对象的概念跟数据库中表的概念对应起来,

简单来说,在golang中,自定义的一个结构体对应着一张表,结构体的实例则对应着表中的一条记录。

Kitex Kitex是字节内部Golang微服务RPC框架 具有高性能、强可扩展的主要特点 支持多协议并且拥有丰富的开源扩展

Hertz Hertz是字节内部的Http框架 参考了其他开源框架的优势 结合字节跳动内部的需求 具有高可用、高性能、高扩展性的特点

Gorm

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

创建记录

| ``` user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} result := db.Create(&user) // 通过数据的指针来创建 user.ID // 返回插入数据的主键 result.Error // 返回 error result.RowsAffected // 返回插入记录的条数

| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

## [](https://gorm.io/zh_CN/docs/create.html#%E7%94%A8%E6%8C%87%E5%AE%9A%E7%9A%84%E5%AD%97%E6%AE%B5%E5%88%9B%E5%BB%BA%E8%AE%B0%E5%BD%95 "用指定的字段创建记录")用指定的字段创建记录

创建记录并更新给出的字段。

| ```
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") 
``` |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

## [](https://gorm.io/zh_CN/docs/create.html#%E6%89%B9%E9%87%8F%E6%8F%92%E5%85%A5 "批量插入")批量插入

要有效地插入大量记录,请将一个 `slice` 传递给 `Create` 方法。 GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值,钩子方法也会被调用。

| ```
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} db.Create(&users)  for _, user := range users {   user.ID // 1,2,3 } 
``` |
| --------------------------------------------------------------------------------------------------------------------------------------------------------- |

使用 `CreateInBatches` 分批创建时,你可以指定每批的数量,例如:

| ```
var users = []User{{name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}  // 数量为 100 db.CreateInBatches(users, 100) 
``` |
| ------------------------------------------------------------------------------------------------------------------------ |

[Upsert](https://gorm.io/zh_CN/docs/create.html#upsert) 和 [Create With Associations](https://gorm.io/zh_CN/docs/create.html#create_with_associations) 也支持批量插入

> **注意** 使用`CreateBatchSize` 选项初始化 GORM 时,所有的创建& 关联 `INSERT` 都将遵循该选项

| ```
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{   CreateBatchSize: 1000, })  db := db.Session(&gorm.Session{CreateBatchSize: 1000})  users = [5000]User{{Name: "jinzhu", Pets: []Pet{pet1, pet2, pet3}}...}  db.Create(&users) // INSERT INTO users xxx (5 batches) // INSERT INTO pets xxx (15 batches) 
``` |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

## [](https://gorm.io/zh_CN/docs/create.html#%E5%88%9B%E5%BB%BA%E9%92%A9%E5%AD%90 "创建钩子")创建钩子

GORM 允许用户定义的钩子有 `BeforeSave`, `BeforeCreate`, `AfterSave`, `AfterCreate` 创建记录时将调用这些钩子方法,请参考 [Hooks](https://gorm.io/zh_CN/docs/hooks.html) 中关于生命周期的详细信息

| ```
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {   u.UUID = uuid.New()      if u.Role == "admin" {         return errors.New("invalid role")     }     return } 
``` |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

如果您想跳过 `钩子` 方法,您可以使用 `SkipHooks` 会话模式,例如:

| ```
DB.Session(&gorm.Session{SkipHooks: true}).Create(&user)  DB.Session(&gorm.Session{SkipHooks: true}).Create(&users)  DB.Session(&gorm.Session{SkipHooks: true}).CreateInBatches(users, 100) 
``` |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------