使用 GORM 在 Go 中连接数据库并实现增删改查操作|青

本文将介绍如何使用 GORMGoORM 库)来连接数据库并实现常见的增删改查操作。GORM 提供了简洁而强大的 API,使得与数据库的交互变得更加简单和高效。我们将学习如何进行数据库连接、定义模型结构、创建数据表,并执行插入、查询、更新和删除等操作。

1.准备工作

1.1 安装 GORM需要做的二三事

依赖管理工具:GORM 是一个第三方库,可以使用任何你喜欢的依赖管理工具(如 Go Modules 或者 GOPATH)来管理项目和依赖。在开始之前确保正确配置了依赖管理工具,并设置了合适的环境。具体可在Goland setting中检查配置。

数据库驱动:GORM 支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),但需要相应的数据库驱动程序。在使用 GORM 之前,要确保已经安装了与所使用的数据库对应的驱动程序。

例如,我要利用MySQL数据库,则在运用GORM之前,我需要首先安装好MySQL,安装流程可以依照网上可搜索到的安装步骤进行。通过以下流程查验自己MySQL是否安装成功。

    1. 启动 MySQL 服务:在安装 MySQL 后,通常会同时安装 MySQL 服务。您可以使用系统的服务管理工具(如 systemctl、service)来启动 MySQL 服务。例如,

在 Linux 系统上,可以使用以下命令启动 MySQL 服务:

```
sudo systemctl start mysql
```

在 Windows 上,可以在服务管理器中启动 MySQL 服务。

image.png

    1. 连接到 MySQL 服务器:打开命令行终端或者 MySQL 客户端,尝试连接到 MySQL 服务器。例如,在命令行中输入以下命令:
    mysql -u 用户名 -p
    
    其中,用户名是你在安装 MySQL 时设置的用户名。然后,会提示您输入密码。输入正确的密码后,如果成功连接到 MySQL 服务器,则说明 MySQL 安装成功。

image.png 导入依赖:导入 GORM 相关的包。可以通过以下命令安装 GORM:

go get -u gorm.io/gorm

或者如果您使用的是旧版本的 GORM(v1),可以使用以下命令:

go get -u github.com/jinzhu/gorm

了解文档和示例:GORM 提供了详细的文档和示例,建议在安装和使用之前先阅读官方文档,以便更好地理解并正确使用 GORM。您可以访问 GORM 的官方网站 GORM 的官方网站获取相关文档和示例

下载对应数据库驱动程序:以下是一些常见数据库的驱动程序以及使用 go get 命令下载它们的示例:

1.2 配置数据库连接信息

  1. 导入 GORM 和适当的数据库驱动:在 Go 项目代码中引入 GORM 和适合您所使用的数据库类型的数据库驱动程序。例如,因为我使用的是 MySQL 数据库,可以导入以下包:

    import (
        "gorm.io/gorm"
        "gorm.io/driver/mysql"
    )
    
  2. 配置数据库连接信息:在代码中设置数据库连接的详细信息,例如数据库类型、主机地址、端口号、用户名和密码等。以下是一个示例的数据库连接配置:

    dsn := "用户:密码@tcp(localhost:3306)/数据库名?charset=utf8mb4&parseTime=True&loc=Local"
    

    其中,"用户" 是您的 MySQL 用户名,默认是root,"密码" 是用户对应的密码,"localhost:3306" 是 MySQL 的主机地址和端口号,"数据库名" 是您要连接的数据库名称。

2. 数据库连接

2.1创建连接

使用 GORM 的 Open 函数创建数据库连接。例如,对于 MySQL 数据库,可以使用以下代码创建连接:

    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        // 处理连接错误
    }

如果连接成功,db 变量将包含 GORM 的数据库连接实例,可以用于后续的数据库操作。

2.2模型结构

定义结构模型

首先,你需要定义与数据库表对应的模型结构。在 Go 中,可以使用结构体来表示模型,并在结构体中定义字段、表名以及任何其他必要的注解。例如,下面是一个名为 User 的模型结构示例:

type User struct {
    gorm.Model
    Name  string
    Email string
}

gorm.Model 是 GORM 提供的基本模型结构,包含了基本的 ID、CreatedAt、UpdatedAt 和 DeletedAt 字段。

此外还可以根据你需要的数据表结构,使用 GORM 的 AutoMigrate 函数自动迁移数据库。这将根据你定义的模型自动创建相应的数据表。这将确保数据库中有与你创建的模型对应的表。例如,对于一个名为 User 的模型结构,可以使用以下代码进行迁移:

  err = db.AutoMigrate(&User{})
    if err != nil {
        // 处理迁移错误
    }

注意

在此时你也可以在MySQL中去创建对应的数据库(其中1,2即使是使用 GORM 的 AutoMigrate 函数也需要完成) 例如:

  1. 在 MySQL 客户端中,输入以下命令来创建一个名为 test 的数据库:
CREATE DATABASE test;
  1. 成功创建数据库后,切换到 test 数据库:
USE test;
  1. 接下来,您可以创建一个名为 users 的表,并定义与后续你在DO中会创建的 User 结构体相对应的列。
CREATE TABLE users (
    ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    Name VARCHAR(255) NOT NULL,
    Age INT
);

2.3增删改查操作

创建数据记录:使用 GORM 的 Create 方法创建数据记录。例如,下面的代码将创建一个新的用户记录:

```go
user := User{Name: "John Doe", Email: "johndoe@example.com"}
result := db.Create(&user)
if result.Error != nil {
   // 处理创建错误
}
```

查询数据记录:使用 GORM 的 FirstFind 或其他查询方法来获取数据记录。例如,下面的代码将检索第一条满足条件的用户记录:

var user User
result := db.First(&user)
if result.Error != nil {
    // 处理查询错误
}

如果需要获取多条记录,可以使用 Find 方法。

更新数据记录: 使用GORM 的 Model 方法指定要更新的模型对象,然后使用 UpdatesSave 方法来保存更改。例如,下面的代码将更新用户记录的姓名:

  result := db.Model(&user).Updates(User{Name: "Jane Doe"})
    if result.Error != nil {
        // 处理更新错误
    }

或者,您也可以直接调用 Save 方法:

  user.Name = "Jane Doe"
    result := db.Save(&user)
    if result.Error != nil {
        // 处理更新错误
    }

删除数据记录:使用 GORM 的 Delete 方法删除数据记录。例如,下面的代码将删除特定用户记录:

    result := db.Delete(&user)
    if result.Error != nil {
        // 处理删除错误
    }

需要注意的是,GORM 会软删除记录(即将记录的 DeletedAt 字段设置为删除时间),除非显示禁用了软删除功能。

3.总结

以下是完整代码:

package main  
  
import (  
"fmt"  
  
"gorm.io/driver/mysql"  
"gorm.io/gorm"  
)  
  
// 定义模型结构  
type User struct {  
gorm.Model  
Name string  
Email string  
}  
  
func main() {  
// 连接数据库  
dsn := "用户:密码@tcp(localhost:3306)/数据库名?charset=utf8mb4&parseTime=True&loc=Local"  
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})  
if err != nil {  
panic("无法连接到数据库")  
}  
  
// 执行数据库迁移  
err = db.AutoMigrate(&User{})  
if err != nil {  
panic("无法执行数据库迁移")  
}  
  
// 创建数据记录  
user := User{Name: "John Doe", Email: "johndoe@example.com"}  
result := db.Create(&user)  
if result.Error != nil {  
panic("无法创建用户")  
}  
  
// 查询数据记录  
var queriedUser User  
result = db.First(&queriedUser)  
if result.Error != nil {  
panic("无法查询用户")  
}  
fmt.Println(queriedUser)  
  
// 更新数据记录  
result = db.Model(&queriedUser).Updates(User{Name: "Jane Doe"})  
if result.Error != nil {  
panic("无法更新用户")  
}  
fmt.Println(queriedUser)  
  
// 删除数据记录  
result = db.Delete(&queriedUser)  
if result.Error != nil {  
panic("无法删除用户")  
}  
}

如果在此之前,你创建了一个相同数据库名但结构体不同的模型导致出现panic: 无法执行数据库迁移的错误时,可以如何解决呢?

出现 "panic: 无法执行数据库迁移" 的错误可能是由于以下原因之一:

  1. 数据库连接配置错误:请确保您在打开数据库连接时使用了正确的用户名、密码、主机和端口等信息。检查 dsn 变量的值是否正确,并确保您可以通过提供的凭据连接到数据库。
  2. 数据库权限问题:请确保连接到数据库的用户具有足够的权限执行数据库迁移操作。部分情况下,可能需要管理员或具有相应权限的用户才能执行数据库结构更改。
  3. 数据库表已存在:如果数据库中已经存在名为 users 的表,执行数据迁移时会失败。您可以尝试删除已存在的表,或者使用其他表名进行迁移测试。

解决办法:

1.简单粗暴地在MySQL中去删除相对于数据库并重新创建 2.使用 GORM 提供的 Migrator 对象,并调用其 DropTable() 方法在Goland项目中删除已经存在的数据库表。

// 获取 Migrator 对象 
migrator := db.Migrator() 
// 检查表是否存在 
if migrator.HasTable("users") { 
    // 删除表 
    err = migrator.DropTable(&User{}) 
    if err != nil { panic("无法删除表") } 
        fmt.Println("成功删除表") 
    } else { 
        fmt.Println("表不存在,无需删除") 
    } 
}
全部评论

相关推荐

11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务