Go语言使用GORM操作数据库使用指南

 更新时间:2023年05月12日 08:41:28   作者:小新x  
GORM(全称为Go Object Relational Mapping)是一个在Go语言中使用的轻量级的对象关系映射(ORM)库,本文主要为大家介绍了GORM操作数据库具体方法,需要的可以参考一下

简介

GORM(全称为Go Object Relational Mapping)是一个在Go语言中使用的轻量级的对象关系映射(ORM)库。ORM是一种编程技术,用于将对象模型与关系型数据库之间进行映射,从而使开发人员能够使用面向对象的方式进行数据库操作。

GORM提供了一套简洁而强大的API,使得开发人员能够以简单的方式进行数据库的增删改查操作,而无需直接编写SQL语句。它支持多种数据库,包括MySQL、PostgreSQL、SQLite等,并提供了丰富的功能,如事务处理、关联关系、预加载、模型验证等。

使用GORM,你可以定义Go语言的结构体来表示数据库中的表,GORM将自动根据这些结构体定义创建、修改和查询数据库。它提供了丰富的方法和选项,可以方便地进行条件查询、分页、排序等操作。

安装 GORM

要安装 GORM,运行以下命令:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

这将安装 GORM 核心库以及 MySQL 驱动程序。

连接到数据库

首先,我们需要连接到数据库。这里是一个使用 GORM 连接到 MySQL 数据库的例子:

package main

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

func main() {
    dsn := "user:password@tcp(localhost: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.Open() 函数连接到数据库。mysql.Open() 函数接受一个 DSN 字符串,其中包含数据库连接信息。

定义模型

GORM 使用结构体来表示数据库中的表。在这个例子中,我们将创建一个名为 User 的结构体来表示一个用户表:

type User struct {
    ID   uint
    Name string
    Age  int
}

GORM 在处理数据库表名时使用了一种约定:它会将结构体名称转换为复数形式,并将其作为数据库表名。这是 GORM 的默认行为。所以,当您定义了一个名为 User 的结构体时,GORM 会自动将其映射到名为 users 的表。

这种约定起源于许多编程语言和框架中的一种惯例,即将表名表示为复数形式,以表示表中包含多个记录。

如果您想要自定义表名,可以在结构体中实现 GORM 的 Tabler 接口。这是一个示例:

type User struct {
   ID   uint
   Name string
  Age  int
}

​​​​​​​func (u User) TableName() string {
   return "custom_users"
}

在这个例子中,我们实现了 TableName() 方法并返回了自定义的表名 "custom_users"。现在,GORM 将使用 "custom_users" 作为表名,而不是默认的 "users"。

GORM 将自动将结构体名称映射到相应的表名。在这种情况下,它将查找一个名为 users 的表。您还可以使用 GORM 标签来自定义字段和表名。

type User struct {
    ID   uint   `gorm:"column:id;primary_key"`          // 自定义字段名为 "id" 并设置为主键
    Name string `gorm:"column:name;type:varchar(100)"`  // 自定义字段名为 "name" 且设置为 VARCHAR 类型,最大长度 100
    Age  int    `gorm:"column:age;type:int;not null"`   // 自定义字段名为 "age" 且设置为 INT 类型,不允许为 NULL
}

​​​​​​​// 使用 TableName 方法自定义表名
func (User) TableName() string {
    return "custom_users"
}

自动迁移

GORM 支持自动迁移,这意味着它可以自动创建和更新数据库表结构。要执行自动迁移,请调用 AutoMigrate() 函数:

db.AutoMigrate(&User{})

请注意,AutoMigrate() 函数不会删除表中的数据或删除未使用的列。

基本 CRUD 操作

插入记录

要插入新记录,可以使用 Create() 函数:

user := User{Name: "John Doe", Age: 25}
result := db.Create(&user)

Create() 函数将新记录插入到数据库中,并更新结构体中的主键字段。

查询记录

要查询记录,可以使用 GORM 提供的各种查询方法,例如 First(),Find() 和 Where():

// 查询单个记录
var user User
result := db.First(&user, 1) // 使用主键查询
result := db.Where("name = ?", "John Doe").First(&user) // 使用条件查询

​​​​​​​// 查询多个记录
var users []User
result := db.Find(&users) // 查询所有用户记录
result := db.Where("age > ?", 25).Find(&users) // 使用条件查询多个记录

GORM 支持链式查询,您可以根据需要组合多个查询条件。

更新记录

要更新记录,可以使用 Save() 或 Updates() 函数:

// 更新单个记录
user := User{ID: 1, Name: "Jane Doe", Age: 30}
result := db.Save(&user) // 使用主键更新记录

​​​​​​​// 使用条件更新多个记录
result := db.Model(&User{}).Where("age > ?", 25).Updates(User{Name: "Updated Name"})

Save() 函数将使用主键更新记录,而 Updates() 函数可以更新一个或多个记录,具体取决于提供的条件。

删除记录

要删除记录,可以使用 Delete() 函数:

// 删除单个记录
user := User{ID: 1}
result := db.Delete(&user) // 使用主键删除记录

​​​​​​​// 使用条件删除多个记录
result := db.Where("age < ?", 18).Delete(&User{})

Delete() 函数可以删除一个或多个记录,具体取决于提供的条件。

详细api详解

1. 查询

查询单个记录

var user User

// 获取匹配条件的第一条记录
db.First(&user, 1) // 根据主键查询
db.Where("name = ?", "John Doe").First(&user) // 根据条件查询

// 获取匹配条件的任意一条记录
db.Take(&user)
db.Where("name = ?", "John Doe").Take(&user)

// 获取匹配条件的最后一条记录
db.Last(&user)
db.Where("name = ?", "John Doe").Last(&user)

查询多个记录

var users []User

// 获取匹配条件的所有记录
db.Find(&users)
db.Where("age > ?", 25).Find(&users)

条件查询

var users []User

// 为查询添加条件
db.Where("name = ?", "John Doe").Find(&users)

// 为查询添加或条件
db.Where("name = ?", "John Doe").Or("name = ?", "Jane Doe").Find(&users)

// 为查询添加非条件
db.Not("name = ?", "John Doe").Find(&users)

排序、限制和偏移

var users []User

// 对查询结果进行排序
db.Order("age desc").Find(&users)

// 限制查询结果的数量
db.Limit(5).Find(&users)

// 设置查询结果的偏移量
db.Offset(10).Find(&users)

2. 插入

user := User{Name: "John Doe", Age: 25}
result := db.Create(&user)

3. 更新

// 更新单个记录
user := User{ID: 1, Name: "Jane Doe", Age: 30}
result := db.Save(&user) // 使用主键更新记录

// 使用条件更新多个记录
result := db.Model(&User{}).Where("age > ?", 25).Updates(User{Name: "Updated Name"})

4. 删除

// 删除单个记录
user := User{ID: 1}
result := db.Delete(&user) // 使用主键删除记录

// 使用条件删除多个记录
result := db.Where("age < ?", 18).Delete(&User{})

总结

GORM(Go Object Relational Mapping)是一个轻量级的对象关系映射(ORM)库,用于在Go语言中进行数据库操作。下面是对GORM的总结:

  • 易用性:GORM提供了简洁而强大的API,使得开发人员可以使用面向对象的方式进行数据库操作,而无需直接编写SQL语句。它采用了一种直观的语法,易于理解和使用。
  • 数据库支持:GORM支持多种数据库,包括MySQL、PostgreSQL、SQLite等,可以轻松切换不同的数据库引擎而无需更改代码。
  • 自动映射:通过定义Go语言的结构体来表示数据库中的表,GORM能够自动创建、修改和查询数据库。它使用一种约定优于配置的方式,将结构体字段与数据库表的列进行映射,简化了数据库操作的过程。
  • 查询和条件:GORM提供了丰富的方法和选项,可以方便地进行条件查询、分页、排序等操作。它支持链式调用,使得查询代码更加清晰和易于组合。
  • 关联关系:GORM支持定义和处理表之间的关联关系,包括一对一、一对多、多对多等关系。它提供了方法来自动处理关联关系的加载、保存和删除,简化了复杂的数据库关联操作。
  • 事务处理:GORM支持事务操作,可以确保一系列数据库操作的原子性。通过使用事务,可以保证数据的一致性和完整性,同时提高数据库的性能和效率。
  • 预加载和延迟加载:GORM支持预加载关联数据,减少了数据库的查询次数,提高了性能。同时,它也支持延迟加载,只在需要时加载关联数据,避免了不必要的数据加载。
  • 模型验证:GORM提供了模型验证功能,可以对结构体中的字段进行验证,确保数据的合法性和完整性。它支持自定义验证规则,并提供了方便的验证方法,简化了数据验证的过程。

总而言之,GORM是一个功能丰富、易用的ORM库,它简化了Go语言中与数据库交互的过程。通过使用GORM,开发人员可以更方便地进行数据库操作,减少了编写SQL语句的工作量,并提高了开发效率和代码的可维护性。

以上就是Go语言使用GORM操作数据库使用指南的详细内容,更多关于Go语言GORM操作数据库的资料请关注脚本之家其它相关文章!

相关文章

  • go语言使用jwt认证的实现

    go语言使用jwt认证的实现

    本文主要介绍了go语言使用jwt认证的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • go语言实现通过FTP库自动上传web日志

    go语言实现通过FTP库自动上传web日志

    这篇文章主要介绍了go语言实现通过FTP库自动上传web日志,非常简单实用,需要的小伙伴快来参考下吧。
    2015-03-03
  • 一文搞懂Golang中iota的用法和原理

    一文搞懂Golang中iota的用法和原理

    我们知道iota是go语言的常量计数器,本文尝试全面总结其使用用法以及其实现原理,需要的朋友可以参考以下内容,希望对大家有所帮助
    2022-08-08
  • Go工具链之go tool fix用法详解

    Go工具链之go tool fix用法详解

    go tool fix 是 Go 工具链中的一个命令,作用是把指定 Go 程序代码包中的的所有旧版本代码修正为新版本的代码,本文将简单介绍一下go tool fix的使用方法,感兴趣的小伙伴可以参考阅读下
    2023-07-07
  • Go语言中的方法、接口和嵌入类型详解

    Go语言中的方法、接口和嵌入类型详解

    这篇文章主要介绍了Go语言中的方法、接口和嵌入类型详解,本文分别对它们做了详细讲解,需要的朋友可以参考下
    2014-10-10
  • golang通过http访问外部网址的操作方法

    golang通过http访问外部网址的操作方法

    这篇文章主要介绍了golang通过http访问外部网址的操作方法,分为 get方式访问外部的接口,Post方式请求外部接口,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • Go语言实战学习之流程控制详解

    Go语言实战学习之流程控制详解

    这篇文章主要为大家详细介绍了Go语言中的流程控制,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助 ,需要的朋友可以参考下
    2022-08-08
  • Go的固定时长定时器和周期性时长定时器

    Go的固定时长定时器和周期性时长定时器

    本文主要介绍了Go的固定时长定时器和周期性时长定时器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Go保证并发安全底层实现详解

    Go保证并发安全底层实现详解

    这篇文章主要为大家介绍了Go保证并发安全底层实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 阿里云go开发环境搭建过程

    阿里云go开发环境搭建过程

    这篇文章主要介绍了阿里云go开发环境搭建过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02

最新评论