使用 GORM 在 Go 中连接数据库并实现增删改查操作|青
本文将介绍如何使用 GORM
(Go
的ORM
库)来连接数据库并实现常见的增删改查操作。GORM 提供了简洁而强大的 API
,使得与数据库的交互变得更加简单和高效。我们将学习如何进行数据库连接、定义模型结构、创建数据表,并执行插入、查询、更新和删除等操作。
1.准备工作
1.1 安装 GORM需要做的二三事
依赖管理工具:GORM 是一个第三方库,可以使用任何你喜欢的依赖管理工具(如 Go Modules
或者 GOPATH
)来管理项目和依赖。在开始之前确保正确配置了依赖管理工具,并设置了合适的环境。具体可在Goland setting中检查配置。
数据库驱动:GORM 支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),但需要相应的数据库驱动程序。在使用 GORM 之前,要确保已经安装了与所使用的数据库对应的驱动程序。
例如,我要利用MySQL数据库,则在运用GORM之前,我需要首先安装好MySQL,安装流程可以依照网上可搜索到的安装步骤进行。通过以下流程查验自己MySQL是否安装成功。
-
- 启动 MySQL 服务:在安装 MySQL 后,通常会同时安装 MySQL 服务。您可以使用系统的服务管理工具(如 systemctl、service)来启动 MySQL 服务。例如,
在 Linux 系统上,可以使用以下命令启动 MySQL 服务:
```
sudo systemctl start mysql
```
在 Windows 上,可以在服务管理器中启动 MySQL 服务。
-
- 连接到 MySQL 服务器:打开命令行终端或者 MySQL 客户端,尝试连接到 MySQL 服务器。例如,在命令行中输入以下命令:
其中,用户名是你在安装 MySQL 时设置的用户名。然后,会提示您输入密码。输入正确的密码后,如果成功连接到 MySQL 服务器,则说明 MySQL 安装成功。mysql -u 用户名 -p
导入依赖:导入 GORM 相关的包。可以通过以下命令安装 GORM:
go get -u gorm.io/gorm
或者如果您使用的是旧版本的 GORM(v1),可以使用以下命令:
go get -u github.com/jinzhu/gorm
了解文档和示例:GORM 提供了详细的文档和示例,建议在安装和使用之前先阅读官方文档,以便更好地理解并正确使用 GORM。您可以访问 GORM 的官方网站 GORM 的官方网站获取相关文档和示例
下载对应数据库驱动程序:以下是一些常见数据库的驱动程序以及使用 go get
命令下载它们的示例:
- MySQL 驱动程序(go-sql-driver/mysql):
go get -u github.com/go-sql-driver/mysql
- PostgreSQL 驱动程序(github.com/lib/pq):
go get -u github.com/lib/pq
- SQLite 驱动程序(github.com/mattn/go-sq…
go get -u github.com/mattn/go-sqlite3
- Microsoft SQL Server 驱动程序(github.com/denisenkom/…
go get -u github.com/denisenkom/go-mssqldb
- Oracle 驱动程序(github.com/godror/godr…
go get -u github.com/godror/godror
1.2 配置数据库连接信息
-
导入 GORM 和适当的数据库驱动:在 Go 项目代码中引入 GORM 和适合您所使用的数据库类型的数据库驱动程序。例如,因为我使用的是 MySQL 数据库,可以导入以下包:
import ( "gorm.io/gorm" "gorm.io/driver/mysql" )
-
配置数据库连接信息:在代码中设置数据库连接的详细信息,例如数据库类型、主机地址、端口号、用户名和密码等。以下是一个示例的数据库连接配置:
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
函数也需要完成)
例如:
- 在 MySQL 客户端中,输入以下命令来创建一个名为
test
的数据库:
CREATE DATABASE test;
- 成功创建数据库后,切换到
test
数据库:
USE test;
- 接下来,您可以创建一个名为
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 的 First
、Find
或其他查询方法来获取数据记录。例如,下面的代码将检索第一条满足条件的用户记录:
var user User
result := db.First(&user)
if result.Error != nil {
// 处理查询错误
}
如果需要获取多条记录,可以使用 Find
方法。
更新数据记录: 使用GORM 的 Model
方法指定要更新的模型对象,然后使用 Updates
或 Save
方法来保存更改。例如,下面的代码将更新用户记录的姓名:
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: 无法执行数据库迁移" 的错误可能是由于以下原因之一:
- 数据库连接配置错误:请确保您在打开数据库连接时使用了正确的用户名、密码、主机和端口等信息。检查
dsn
变量的值是否正确,并确保您可以通过提供的凭据连接到数据库。 - 数据库权限问题:请确保连接到数据库的用户具有足够的权限执行数据库迁移操作。部分情况下,可能需要管理员或具有相应权限的用户才能执行数据库结构更改。
- 数据库表已存在:如果数据库中已经存在名为
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("表不存在,无需删除")
}
}