使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作

37 阅读3分钟

数据库的连接

对于 mysql 数据库

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

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

以上将 user, pass, dbname字段填入对于数据库即可连接到 mysql 对应的数据库

数据库中表的创建 (可以通过自动迁移来进行创建)

AutoMigrate()

例如:

// UserInfo 用户信息
type UserInfo struct { 
    ID uint 
    Name string 
    Gender string 
    Hobby string 
}

func main() {
    dsn := "root:@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
            panic("failed to connect database")
    }

    // 自动迁移
    err = db.AutoMigrate(&UserInfo{})
    if err != nil {
            panic("failed to migrate")
    }
}

这样则 gorm 会根据 UserInfo 结构体 来创建对应的 表结构 但默认会使用 snack_case 的命名方式 如果想要使用其他的方式, 可以通过 TableName 函数接口的实现来改变表中的命名 eg:

func (u UserInfo)TableName string {
    return "userInfo"
}

gorm 支持结构体标记(tags)

声明 model 时,tag 是可选的,tag 名大小写不敏感,但相对而言建议使用 camelCase 风格

在 gorm 中, 会默认把 名为 ID 的作为主键 (Primary Key) eg:

type User struct {
  ID   string // 名为`ID`的字段会默认作为表的主键
  Name string
}

// 使用`AnimalID`作为主键
type Animal struct {
  AnimalID int64 `gorm:"primary_key"`
  Name     string
  Age      int64
}

数据库中数据的 增删查改

增加 (Create)

用于创建记录

type User struct {
	ID       uint
	Name     string
	Age      uint8
	Birthday time.Time
}
result := db.Create(&user)       // 通过数据的指针来创建
fmt.Println(user.ID)             // 返回插入数据的主键
fmt.Println(result.Error)        // 返回 error
fmt.Println(result.RowsAffected) // 返回插入记录的条数

通过网课与gorm文档可知 Create 可以创建多条记录: 通过在 Create 的参数中填入数组即可创建多条记录 并且可以缺省不重要的字段 同时在 gorm 中也支持使用 map 来插入记录 例如: map[string]interface{} 与 map[string]interface{}{} 但是要注意: 从 map 创建时,不会调用 hook,不会保存关联,主键值也不会返回填充

查找 (Find, First, Last)

用于查找对应的记录, 一般可以配合 Where 等一起使用 First方法对数据库进行查询时相当于 LIMIT 1, 既查询第一个数据 而 Last 方法刚好相反, 是对最后一个数据进行查询 要查询所有满足条件的结果就要使用Find方法来获得所有结果

删除 (Delete)

可以使用 Delete 方法来删除指定条件的数据 注意如果当所创建的表中有 DeleteAt字段, 则可以自动获得软删除的功能, 当调用 Delete方法时不会从数据库中将该记录真正的删除, 只会将DeletedAt 字段的值会被设置为当前时间此时如果想要永久删除就要调用 Unscoped方法来Delete

修改 (Update)

使用 Update 方法可以对对应数据进行修改, 一般先通过 Model 来获得对应的表, 然后对表中数据进行修改, 但要注意通过结构体不能修改零值, 要将零值修改需要使用 map 来对其进行修改