GORM 是一个非常流行的 Go 语言 ORM(对象关系映射)库,它可以方便地与数据库交互,同时支持自动迁移、查询构建器等强大功能。本文将介绍如何使用 GORM 连接数据库并实现增删改查(CRUD)操作。
环境准备
安装 GORM
首先,需要安装 GORM 和对应的数据库驱动程序(这里以 MySQL 为例)。
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
数据库准备
在开始之前,需要准备一个 MySQL 数据库,并创建一个测试表。例如,可以创建一个名为 users 的表:
CREATE DATABASE gorm_demo;
USE gorm_demo;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
age INT NOT NULL
);
使用 GORM 连接数据库
初始化数据库连接
在 Go 项目中,通常在 main.go 文件中初始化数据库连接。以下是一个基本的数据库连接代码:
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
var DB *gorm.DB
func initDB() {
// 数据库连接字符串: 用户名:密码@tcp(主机:端口)/数据库名?参数
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
// 初始化 GORM 数据库连接
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("数据库连接失败: %v", err)
}
log.Println("数据库连接成功!")
}
func main() {
initDB()
}
定义模型
GORM 使用结构体与数据库表进行映射。以下是 User 模型的定义:
package main
import "gorm.io/gorm"
// 定义 User 模型
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"type:varchar(100);not null"`
Email string `gorm:"type:varchar(100);unique;not null"`
Age int `gorm:"not null"`
}
自动迁移
GORM 提供了自动迁移功能,可以根据模型自动创建或更新数据库表:
func autoMigrate() {
err := DB.AutoMigrate(&User{})
if err != nil {
log.Fatalf("自动迁移失败: %v", err)
}
log.Println("自动迁移成功!")
}
func main() {
initDB()
autoMigrate()
}
实现增删改查操作
1. 创建记录(Create)
使用 DB.Create 方法可以向数据库插入一条记录:
func createUser() {
user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
result := DB.Create(&user)
if result.Error != nil {
log.Fatalf("创建用户失败: %v", result.Error)
}
log.Printf("用户创建成功: %+v\n", user)
}
2. 查询记录(Read)
GORM 提供了多种查询方法,以下是常见的查询操作:
根据主键查询
func getUserByID(id uint) {
var user User
result := DB.First(&user, id)
if result.Error != nil {
log.Printf("查询用户失败: %v", result.Error)
return
}
log.Printf("查询到的用户: %+v\n", user)
}
根据条件查询
func getUserByEmail(email string) {
var user User
result := DB.Where("email = ?", email).First(&user)
if result.Error != nil {
log.Printf("查询用户失败: %v", result.Error)
return
}
log.Printf("查询到的用户: %+v\n", user)
}
查询多条记录
func getAllUsers() {
var users []User
result := DB.Find(&users)
if result.Error != nil {
log.Printf("查询用户失败: %v", result.Error)
return
}
log.Printf("查询到的所有用户: %+v\n", users)
}
3. 更新记录(Update)
使用 DB.Save 或 DB.Model 方法可以更新记录:
更新单个字段
func updateUserEmail(id uint, newEmail string) {
result := DB.Model(&User{}).Where("id = ?", id).Update("email", newEmail)
if result.Error != nil {
log.Printf("更新用户失败: %v", result.Error)
return
}
log.Printf("用户更新成功,影响行数: %d\n", result.RowsAffected)
}
更新多个字段
func updateUserDetails(id uint, name string, age int) {
result := DB.Model(&User{}).Where("id = ?", id).Updates(User{Name: name, Age: age})
if result.Error != nil {
log.Printf("更新用户失败: %v", result.Error)
return
}
log.Printf("用户信息更新成功,影响行数: %d\n", result.RowsAffected)
}
4. 删除记录(Delete)
使用 DB.Delete 方法可以删除记录:
func deleteUser(id uint) {
result := DB.Delete(&User{}, id)
if result.Error != nil {
log.Printf("删除用户失败: %v", result.Error)
return
}
log.Printf("用户删除成功,影响行数: %d\n", result.RowsAffected)
}
完整代码示例
以下是完整的代码实现:
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
var DB *gorm.DB
// User 模型
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"type:varchar(100);not null"`
Email string `gorm:"type:varchar(100);unique;not null"`
Age int `gorm:"not null"`
}
// 初始化数据库连接
func initDB() {
dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("数据库连接失败: %v", err)
}
log.Println("数据库连接成功!")
}
// 自动迁移
func autoMigrate() {
err := DB.AutoMigrate(&User{})
if err != nil {
log.Fatalf("自动迁移失败: %v", err)
}
log.Println("自动迁移成功!")
}
// CRUD 操作
func createUser() {
user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
result := DB.Create(&user)
if result.Error != nil {
log.Fatalf("创建用户失败: %v", result.Error)
}
log.Printf("用户创建成功: %+v\n", user)
}
func getUserByID(id uint) {
var user User
result := DB.First(&user, id)
if result.Error != nil {
log.Printf("查询用户失败: %v", result.Error)
return
}
log.Printf("查询到的用户: %+v\n", user)
}
func updateUserEmail(id uint, newEmail string) {
result := DB.Model(&User{}).Where("id = ?", id).Update("email", newEmail)
if result.Error != nil {
log.Printf("更新用户失败: %v", result.Error)
return
}
log.Printf("用户更新成功,影响行数: %d\n", result.RowsAffected)
}
func deleteUser(id uint) {
result := DB.Delete(&User{}, id)
if result.Error != nil {
log.Printf("删除用户失败: %v", result.Error)
return
}
log.Printf("用户删除成功,影响行数: %d\n", result.RowsAffected)
}
func main() {
initDB()
autoMigrate()
// 测试 CRUD 操作
createUser()
getUserByID(1)
updateUserEmail(1, "newalice@example.com")
deleteUser(1)
}
总结
通过上述步骤,我们实现了使用 GORM 连接数据库并进行增删改查操作。GORM 提供了强大的功能和灵活的 API,适合大部分的数据库操作需求。在实际项目中,还可以结合事务、预加载等功能进一步增强数据库操作能力。