Gorm框架| 青训营笔记

278 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天

一、重点内容:

本次青训营大作业项目也运用了Gorm框架连接MySQL数据库。

1.1 知识要点有哪些?

  • Gorm概述
  • Gorm模型定义
  • Gorm连接数据库
  • Gorm CRUD相关操作

二、详细知识点介绍:

2.1 Gorm概述

Gorm是一个基于Go语言的ORM(对象关系映射)框架,可以将Go语言的结构体(struct)与数据库表之间进行映射,实现数据的CRUD(增删改查)操作。Gorm的设计灵感来源于Ruby on Rails中的Active Record模式,通过简单的API设计,提供了很多便捷的数据库操作方法。

以下是Gorm框架的一些特点:

  1. 简单易用:Gorm提供了简洁的API接口,支持链式调用,让开发者能够快速上手,实现常见的数据库操作。
  2. 支持多种数据库:Gorm支持多种常见的关系型数据库,例如MySQL、PostgreSQL、SQLite、SQL Server等,且支持自定义驱动,可以很方便地扩展。
  3. 自动迁移:Gorm可以根据定义的Go结构体自动创建数据库表,也可以自动更新表结构,非常方便。
  4. 高级查询:Gorm支持复杂的查询操作,例如嵌套查询、联表查询等。
  5. 事务支持:Gorm支持事务,开发者可以使用简单的API进行事务管理,确保数据的一致性。

总之,Gorm是一个简单易用、功能强大的ORM框架,适合Go语言开发者使用。

2.2 Gorm模型定义

在Gorm框架中,模型定义是指将数据库表与Go语言中的结构体(struct)进行映射,实现数据库表和结构体之间的互相转换。模型定义需要包含表名、字段名、数据类型、约束条件等信息。 以下是Gorm框架中模型定义的示例:

type User struct {
    gorm.Model // 包含ID、CreatedAt、UpdatedAt、DeletedAt字段
    Name      string
    Age       uint
    Email     string `gorm:"unique;not null"`
    Password  string `gorm:"not null"`
    Avatar    []byte
}

在上述示例中,User结构体定义了一个名为users的数据库表,其中包含了ID、CreatedAt、UpdatedAt、DeletedAt、Name、Age、Email、Password、Avatar等字段。其中,gorm.Model是Gorm框架提供的用于实现常用字段的结构体,包括ID、CreatedAt、UpdatedAt、DeletedAt等字段。

另外,Email和Password字段都添加了约束条件,Email字段的约束条件为唯一且非空,Password字段的约束条件为非空。

通过这样的模型定义,我们可以方便地进行数据库操作,例如查询、插入、更新、删除等操作。同时,Gorm框架还支持自动迁移功能,可以根据模型定义自动创建或更新对应的数据库表结构,非常方便。

2.3 Gorm连接数据库

Gorm框架连接数据库需要先安装对应的数据库驱动,以MySQL为例,需要安装mysql驱动:

go get -u gorm.io/driver/mysql

在Go代码中使用Gorm连接MySQL数据库,示例如下:

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

dsn := "user:password@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 {
    // 错误处理
}

其中,dsn表示数据源名称,格式为"用户名:密码@协议(地址:端口)/数据库名称?参数",参数用于设置字符集、时区等选项。上述示例中,连接的数据库是本地的MySQL数据库,用户名为user,密码为password,数据库名称为dbname。

连接成功后,db变量即可用于执行各种数据库操作,例如查询、插入、更新、删除等。

2.4 Gorm CRUD相关操作

  1. 查询数据
var users []User// 查询所有数据
db.Find(&users)
var user User// 查询单个数据
db.First(&user, 1)
db.Where("name = ?", "Tom").Find(&users)// 条件查询
db.Where(&User{Name: "Tom"}).Find(&users)// 结构体条件查询
db.Raw("SELECT * FROM users WHERE name = ?", "Tom").Scan(&users)// 原生SQL查询
  1. 插入数据
user := User{Name: "Tom", Age: 20}// 插入单个数据
db.Create(&user)
users := []User{{Name: "Tom", Age: 20}, {Name: "Lucy", Age: 18}}// 批量插入数据
db.Create(&users)
  1. 更新数据
var user User// 更新单个数据
db.First(&user, 1)
user.Age = 21
db.Save(&user)
db.Model(&User{}).Where("age < ?", 18).Update("age", 18)// 批量更新数据
  1. 删除数据
var user User// 删除单个数据
db.Delete(&user, 1)
db.Delete(&User{}, "age < ?", 18)// 批量删除数据

以上示例中,User表示数据库表对应的Go结构体,其中包含了表的字段和数据类型等信息。在查询、插入、更新、删除操作中,都可以使用该结构体及其字段进行条件筛选、数据插入等操作。

三、引用参考