2. GORM
GORM
GORM是一个功能强大的Go语言ORM库,提供了简洁的API来操作数据库。本文将详细介绍如何使用GORM与MySQL数据库进行交互。
安装GORM和MySQL驱动
首先,我们需要安装GORM和MySQL驱动。可以使用以下命令:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
连接数据库
在使用GORM连接MySQL数据库时,我们需要提供数据源名称(DSN),其中包含用户名、密码、主机地址、端口号和数据库名称等信息。
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
func main() {
// 定义数据源名称
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 {
log.Fatalf("failed to connect database: %v", err)
}
}
初始化连接
GORM会自动管理数据库连接池,因此我们不需要手动设置最大连接数和最大空闲连接数。不过,如果有特殊需求,可以通过sql.DB
对象进行设置。
sqlDB, err := db.DB()
if err != nil {
log.Fatalf("failed to get database object: %v", err)
}
// 设置最大打开连接数
sqlDB.SetMaxOpenConns(100)
// 设置最大空闲连接数
sqlDB.SetMaxIdleConns(10)
定义模型
在GORM中,我们通过定义结构体来映射数据库表。每个字段对应表中的一列。
// User 结构体映射到数据库中的users表
type User struct {
ID uint `gorm:"primaryKey;column:id"` // ID为主键
Name string `gorm:"size:255;column:name"` // Name字段最大长度为255
Age int `gorm:"column:age"` // Age字段
}
自动迁移
GORM提供了自动迁移功能,可以根据模型结构自动创建或更新数据库表。
// 自动迁移User结构体
db.AutoMigrate(&User{})
CRUD操作
创建记录
使用Create
方法可以向数据库中插入一条新记录。
// 创建一个新的User记录
user := User{Name: "张三", Age: 25}
result := db.Create(&user)
if result.Error != nil {
log.Fatalf("failed to create user: %v", result.Error)
}
查询记录
单行查询
使用First
方法可以查询符合条件的第一条记录。
// 查询ID为1的User记录
var user User
result := db.First(&user, 1) // 根据主键查询
if result.Error != nil {
log.Printf("failed to find user: %v", result.Error)
}
多行查询
使用Find
方法可以查询符合条件的多条记录。
// 查询年龄大于20的所有User记录
var users []User
result := db.Where("age > ?", 20).Find(&users)
if result.Error != nil {
log.Printf("failed to find users: %v", result.Error)
}
更新记录
使用Save
方法可以更新记录。
// 更新User记录的Age字段
user.Age = 26
result := db.Save(&user)
if result.Error != nil {
log.Fatalf("failed to update user: %v", result.Error)
}
删除记录
使用Delete
方法可以删除记录。
// 删除User记录
result := db.Delete(&user)
if result.Error != nil {
log.Fatalf("failed to delete user: %v", result.Error)
}
事务支持
GORM支持事务操作,可以通过Transaction
方法来执行事务。
// 使用事务创建两个User记录
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&User{Name: "李四", Age: 30}).Error; err != nil {
return err
}
if err := tx.Create(&User{Name: "王五", Age: 35}).Error; err != nil {
return err
}
return nil
})
if err != nil {
log.Fatalf("transaction failed: %v", err)
}
预处理和SQL注入
GORM会自动处理SQL注入问题,因此我们不需要手动拼接SQL语句。所有的查询条件都可以通过链式调用来实现。
// 查询Name为"张三"的User记录
db.Where("name = ?", "张三").First(&user)
完整示例
以下是一个完整的示例代码,展示了如何使用GORM连接MySQL数据库并进行CRUD操作。
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
// User 结构体映射到数据库中的users表
type User struct {
ID uint `gorm:"primaryKey;column:id"` // ID为主键
Name string `gorm:"size:255;column:name"` // Name字段最大长度为255
Age int `gorm:"column:age"` // Age字段
}
func main() {
// 定义数据源名称
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 {
log.Fatalf("failed to connect database: %v", err)
}
// 自动迁移User结构体
db.AutoMigrate(&User{})
// 创建一个新的User记录
user := User{Name: "张三", Age: 25}
result := db.Create(&user)
if result.Error != nil {
log.Fatalf("failed to create user: %v", result.Error)
}
// 查询ID为1的User记录
var queriedUser User
result = db.First(&queriedUser, user.ID) // 根据主键查询
if result.Error != nil {
log.Printf("failed to find user: %v", result.Error)
} else {
fmt.Printf("Queried User: %+v\n", queriedUser)
}
// 更新User记录的Age字段
queriedUser.Age = 26
result = db.Save(&queriedUser)
if result.Error != nil {
log.Fatalf("failed to update user: %v", result.Error)
}
// 删除User记录
result = db.Delete(&queriedUser)
if result.Error != nil {
log.Fatalf("failed to delete user: %v", result.Error)
}
}
程序输出
假设数据库连接成功,程序将输出如下信息:
Queried User: {ID:1 Name:张三 Age:25}
这表示程序成功创建、查询、更新并删除了一条用户记录。
代码说明
连接数据库:使用
gorm.Open
方法连接MySQL数据库,数据源名称(DSN)中包含了数据库连接的必要信息。自动迁移:使用
AutoMigrate
方法根据User
结构体自动创建或更新数据库表。创建记录:使用
Create
方法向数据库中插入一条新记录。查询记录:使用
First
方法查询符合条件的第一条记录。更新记录:使用
Save
方法更新记录。删除记录:使用
Delete
方法删除记录。
小结
这篇文章简单介绍了GORM的基本使用方法,包括连接数据库、定义模型、CRUD操作、事务支持等内容。希望对您有所帮助!,如需了解GORM详细的用法,可以参考:GORM中文官网