使用 GORM 连接数据库并实现增删改查操作

131 阅读3分钟

GORM 是一个功能强大的 Go 语言对象关系映射(ORM)库,提供了简单易用的接口来操作数据库表,广泛应用于 Go 项目的开发中。本文将带你了解如何使用 GORM 连接数据库,并实现基本的增删改查(CRUD)操作。

1. 环境准备

安装 GORM 和数据库驱动

在使用 GORM 之前,需要安装 GORM 以及对应的数据库驱动。以 MySQL 为例,执行以下命令安装:

bash
复制代码
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

如果使用其他数据库,例如 PostgreSQL 或 SQLite,只需替换相应的驱动包即可。

初始化数据库

在 MySQL 中创建一个示例数据库 gorm_demo,并添加一张名为 users 的表:

sql
复制代码
CREATE DATABASE gorm_demo;
USE gorm_demo;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

2. 使用 GORM 连接数据库

以下是一个简单的数据库连接示例:

go
复制代码
package main

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

func main() {
	// 数据库连接配置
	dsn := "username:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
	// 使用 GORM 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("Failed to connect to database: %v", err)
	}
	fmt.Println("Database connected successfully!")

	// 继续你的操作...
}

注意:将 usernamepassword 替换为实际的 MySQL 用户名和密码。

3. 定义模型结构

在 GORM 中,每张表对应一个结构体。以下是 users 表对应的模型:

go
复制代码
type User struct {
	ID        uint   `gorm:"primaryKey"`
	Name      string `gorm:"size:100;not null"`
	Age       int    `gorm:"not null"`
	CreatedAt string
	UpdatedAt string
}

4. 实现增删改查操作

自动迁移表结构

在操作数据库之前,可以使用 GORM 的自动迁移功能同步表结构:

go
复制代码
err = db.AutoMigrate(&User{})
if err != nil {
	log.Fatalf("Failed to migrate database: %v", err)
}

增加数据

以下代码展示如何向 users 表中插入数据:

go
复制代码
func createUser(db *gorm.DB) {
	user := User{Name: "Alice", Age: 25}
	result := db.Create(&user)

	if result.Error != nil {
		log.Printf("Failed to create user: %v", result.Error)
	} else {
		fmt.Printf("User created successfully: %+v\n", user)
	}
}

查询数据

使用 GORM 查询 users 表中的数据:

go
复制代码
func queryUsers(db *gorm.DB) {
	var users []User
	result := db.Find(&users)

	if result.Error != nil {
		log.Printf("Failed to query users: %v", result.Error)
	} else {
		fmt.Printf("Users found: %+v\n", users)
	}
}

更新数据

更新用户信息可以使用以下方法:

go
复制代码
func updateUser(db *gorm.DB, id uint) {
	var user User
	if err := db.First(&user, id).Error; err != nil {
		log.Printf("User not found: %v", err)
		return
	}

	user.Name = "Updated Name"
	user.Age = 30
	if err := db.Save(&user).Error; err != nil {
		log.Printf("Failed to update user: %v", err)
	} else {
		fmt.Printf("User updated successfully: %+v\n", user)
	}
}

删除数据

通过主键 ID 删除用户:

go
复制代码
func deleteUser(db *gorm.DB, id uint) {
	if err := db.Delete(&User{}, id).Error; err != nil {
		log.Printf("Failed to delete user: %v", err)
	} else {
		fmt.Printf("User with ID %d deleted successfully\n", id)
	}
}

5. 整体程序示例

将所有功能整合到一个程序中,完整代码如下:

go
复制代码
package main

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

type User struct {
	ID        uint   `gorm:"primaryKey"`
	Name      string `gorm:"size:100;not null"`
	Age       int    `gorm:"not null"`
	CreatedAt string
	UpdatedAt string
}

func main() {
	dsn := "username:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("Failed to connect to database: %v", err)
	}

	// 自动迁移表结构
	err = db.AutoMigrate(&User{})
	if err != nil {
		log.Fatalf("Failed to migrate database: %v", err)
	}

	// 增删改查操作
	createUser(db)
	queryUsers(db)
	updateUser(db, 1)
	deleteUser(db, 1)
}

func createUser(db *gorm.DB) {
	user := User{Name: "Alice", Age: 25}
	result := db.Create(&user)
	if result.Error != nil {
		log.Printf("Failed to create user: %v", result.Error)
	} else {
		fmt.Printf("User created successfully: %+v\n", user)
	}
}

func queryUsers(db *gorm.DB) {
	var users []User
	result := db.Find(&users)
	if result.Error != nil {
		log.Printf("Failed to query users: %v", result.Error)
	} else {
		fmt.Printf("Users found: %+v\n", users)
	}
}

func updateUser(db *gorm.DB, id uint) {
	var user User
	if err := db.First(&user, id).Error; err != nil {
		log.Printf("User not found: %v", err)
		return
	}

	user.Name = "Updated Name"
	user.Age = 30
	if err := db.Save(&user).Error; err != nil {
		log.Printf("Failed to update user: %v", err)
	} else {
		fmt.Printf("User updated successfully: %+v\n", user)
	}
}

func deleteUser(db *gorm.DB, id uint) {
	if err := db.Delete(&User{}, id).Error; err != nil {
		log.Printf("Failed to delete user: %v", err)
	} else {
		fmt.Printf("User with ID %d deleted successfully\n", id)
	}
}

6. 结语

GORM 提供了丰富的功能,使得操作数据库变得简单高效。通过本文的学习,你已经掌握了如何连接数据库、定义模型并实现基本的增删改查操作。在实际项目中,可以进一步学习 GORM 的高级功能,例如事务处理、预加载关联数据等,以满足更复杂的需求。