GORM入门 | 青训营

90 阅读5分钟

基本使用

GORM是一个流行的Go语言ORM库,它提供了简单且强大的方法来处理数据库操作。在本教程中,我们将介绍如何使用GORM来执行常见的数据库操作,如创建表、插入数据、查询数据和更新数据。

  1. 引入依赖

在使用GORM之前,首先需要在Go项目中引入GORM库。可以使用Go模块来管理依赖关系。在项目的根目录下执行以下命令引入GORM库:

go get -u gorm.io/gorm

2. 连接数据库

在开始之前,我们需要连接到数据库。GORM支持多种数据库,包括MySQL、PostgreSQL、SQLite等。连接到MySQL数据库:

package main

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

func main() {
    // 连接到MySQL数据库
    dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("无法连接到数据库")
    }

    // 使用db进行数据库操作
    // ...
}

在dsn中,将"user"和"password"替换为你的MySQL用户名和密码,将"database_name"替换为你要连接的数据库名称。

  1. 定义模型

在GORM中,模型代表数据库中的表。定义一个模型结构体时,可以使用GORM提供的标签来指定表名、字段名和约束等信息。eg:

package main

import "gorm.io/gorm"

type User struct {
    gorm.Model
    Name  string
    Email string `gorm:"unique"`
}

在这个示例中,我们定义了一个名为"User"的模型,有两个字段:"Name"和"Email"。"gorm.Model"是一个内置的模型结构体,它包含了一些常用的字段,如ID、CreatedAt、UpdatedAt和DeletedAt。

  1. 创建表

一旦定义了模型,就可以使用GORM的AutoMigrate函数来创建表。在连接数据库的代码后面添加以下代码:

err = db.AutoMigrate(&User{})
if err != nil {
    panic("无法创建表")
}

在这个示例中,通过调用AutoMigrate函数来创建"User"模型对应的表。可以传递多个模型作为参数,以一次创建多个表。

  1. 插入数据

使用GORM插入数据非常简单。插入一条用户记录:

user := User{Name: "John Doe", Email: "johndoe@example.com"}
result := db.Create(&user)
if result.Error != nil {
    panic("无法插入数据")
}

在这个示例中,我们创建了一个名为"John Doe"、邮箱为"johndoe@example.com"的用户对象,并使用Create方法将其插入到数据库中。

  1. 查询数据

GORM提供了丰富的方法来查询数据。常用的查询示例:

  • 查询单个记录:
var user User
result := db.First(&user, 1) // 根据ID查询
if result.Error != nil {
    panic("无法查询数据")
}

使用First方法查询ID为1的用户记录,并将结果存储在"user"变量中。

  • 查询多个记录:
var users []User
result := db.Find(&users)
if result.Error != nil {
    panic("无法查询数据")
}

使用Find方法查询所有用户记录,并将结果存储在"users"切片中。

  • 条件查询:
var user User
result := db.Where("name = ?", "John Doe").First(&user)
if result.Error != nil {
    panic("无法查询数据")
}

使用Where方法添加条件查询,查询名字为"John Doe"的用户记录。

  1. 更新数据

GORM提供了Update和Updates方法来更新数据。更新用户记录:

var user User
result := db.First(&user, 1)
if result.Error != nil {
    panic("无法查询数据")
}

user.Name = "Jane Doe"
result = db.Save(&user)
if result.Error != nil {
    panic("无法更新数据")
}

首先使用First方法查询ID为1的用户记录,并将结果存储在"user"变量中。然后修改"user"对象的Name字段,并使用Save方法将修改后的数据保存到数据库中。

非常抱歉,我会提供一些GORM的高级内容,以帮助你更好地理解和使用该库。

扩展内容

  1. 关联关系

GORM支持在模型之间建立关联关系,包括一对一、一对多和多对多关系。eg:

  • 一对一关系:
type User struct {
    gorm.Model
    Profile Profile
}

type Profile struct {
    gorm.Model
    UserID uint
    User   User
}

User模型和Profile模型之间建立了一对一的关系。Profile模型包含一个UserID字段,用于存储关联的User模型的ID。User模型包含一个Profile字段,表示与之关联的Profile模型。

  • 一对多关系:
type User struct {
    gorm.Model
    Posts []Post
}

type Post struct {
    gorm.Model
    UserID uint
    User   User
}

User模型和Post模型之间建立了一对多的关系。Post模型包含一个UserID字段,用于存储关联的User模型的ID。User模型包含一个Posts字段,表示与之关联的多个Post模型。

  • 多对多关系:
type User struct {
    gorm.Model
    Roles []Role `gorm:"many2many:user_roles;"`
}

type Role struct {
    gorm.Model
    Users []User `gorm:"many2many:user_roles;"`
}

User模型和Role模型之间建立了多对多的关系。通过在模型结构体的字段上添加"gorm:"many2many:关联表名;""标签,可以指定多对多关系的关联表。

  1. 预加载

使用GORM的预加载功能可以在查询数据时一次性加载关联的数据,避免N+1查询问题。eg:

  • 预加载一对一关联:
var user User
result := db.Preload("Profile").First(&user, 1)

通过Preload方法预加载User模型的Profile关联。

  • 预加载一对多关联:
var user User
result := db.Preload("Posts").First(&user, 1)

通过Preload方法预加载User模型的Posts关联。

  • 预加载多对多关联:
var user User
result := db.Preload("Roles").First(&user, 1)

通过Preload方法预加载User模型的Roles关联。

  1. 事务处理

GORM提供了事务处理的功能,可以确保一系列数据库操作要么全部成功,要么全部回滚。以下是一个示例:

// 开始事务
tx := db.Begin()

// 执行数据库操作
// ...

// 提交事务
err := tx.Commit().Error
if err != nil {
    // 回滚事务
    tx.Rollback()
    panic("事务提交失败")
}

通过调用Begin方法开始一个事务。在事务中执行数据库操作,如果操作成功,则调用Commit方法提交事务;如果出现错误,则调用Rollback方法回滚事务。

  1. 原生SQL查询

除了提供ORM功能外,GORM还支持执行原生SQL查询。以下是一个示例:

var users []User
result := db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)
if result.Error != nil {
    panic("原生SQL查询失败")
}

在这个示例中,通过Raw方法执行原生的SELECT查询,并使用Scan方法将结果映射到User模型的切片中。