gorm初使用 | 青训营笔记

95 阅读3分钟

这是我参与[第五届青训营]伴学笔记创作活动的第5天。

简介

本篇笔记主要是记录 gorm 的介绍和基本使用方法。在本篇文章中只展示 mysql 的用法。

什么是gorm

orm Object-Relation Mapping,即对象关系映射。主要在于能够在关系型数据库和对象之间作一个映射,使得我们不必再去使用复杂的 SQL 语句,只要使用对象就能完成对数据库中的数据操作。 gorm 使用 golang 所写的一个 orm 库。

安装

使用 go get 来获取 gorm

    go get github.com/jinzhu/gorm

引入 gorm

这里使用 gorm 文档中的例子来展示如何引入 gorm。 先设置数据库的基础信息,然后就可以使用 gorm.Open 来引入 gorm。

package main

import (
  "gorm.io/gorm"
  "gorm.io/driver/mysql"
)

type Product struct {
  gorm.Model
  Code  string
  Price uint
}

func main() {
  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{})
  if err != nil {
    panic("failed to connect database")
  }
}

上面代码中的 gorm.Model 为 gorm 中的内置结构体, 其包括字段 ID, CreatedAt,UpdatedAt, DeletedAt。其结构如下所示:

type Model struct {
    ID        uint           `gorm:"primaryKey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt gorm.DeletedAt `gorm:"index"`
}

gorm 倾向于约定,而不是配置。默认情况下,gorm 使用 ID 作为主键,使用结构体名的蛇形复数作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间

创建记录

创建记录为数据库操作的增加数据。通过 gorm 我们能很好的完成对数据库的操作。

在 gorm中, 我们通过 Create 函数来创建一个新的记录,注意要通过数据的指针来创建,该函数返回user.Idresult.Errorresult.RowsAffected,分别代表插入数据的主键,error,插入记录的条数。

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user)

我们也可以使用选定个别字段来创建一个记录

db.Select("Name", "Age", "CreatedAt").Create(&user)

也可以使用 map 来创建记录。

DB.Model(&User{}).Create(map[string]interface{}{
    "Name": "jinzhu", "Age": 18,
})

查询记录

查询记录即为数据库操作中的查找数据。

使用 Where 语句以及 Find 函数查询,Find 函数会返回查询的所有满足查询条件的数据。其基本方式为:

db.Where("name = ?", "jinzhu").Find(&users)

同时 gorm 还提供 NotOrSelectLimitOffsetFirstLastGroupHavingDistinctJoins 等函数来完成 mysql 查询。 当未找到数据时,会返回ErrRecordNotFound错误。

更新记录

更新记录即为数据库操作中的数据更新。 使用 Update 更新数据,其基本使用方式如下所示:

db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
db.Model(&user).Where("active = ?", true).Update("name", "hello")

第二种方式在更新时会自动带上 user 对象的主键。

删除记录

删除记录即为数据库操作中的数据删除。 使用 Delete 删除数据,其基本用法如下所示:

db.Delete(&User{}, 10)
db.Where("name = ?", "jinzhu").Delete(&email{})

如果您的模型包含了一个 gorm.deletedat 字段(gorm.Model 已经包含了该字段),它将自动获得软删除的能力。 拥有软删除能力的模型调用 Delete 时,记录不会被从数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间, 并且你不能再通过正常的查询方法找到该记录。 查找被软删除的记录:

db.Unscoped().Where("age = 20").Find(&users)  

永久删除:

db.Unscoped().Delete(&order) // DELETE FROM orders WHERE id=10;