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

59 阅读3分钟

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


一、什么是 GORM

GORM 是 Go 语言中功能强大的 ORM(对象关系映射)库,提供了对数据库操作的抽象层,支持主流数据库(如 MySQL、PostgreSQL、SQLite 等),同时具有灵活的查询构造和模型定义功能。


二、安装 GORM

确保已安装 Go 环境,使用以下命令安装 GORM 和其驱动程序(以 MySQL 为例):

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

三、基本配置

  1. 数据库连接

以下是使用 GORM 连接 MySQL 数据库的代码:

package main

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

var db *gorm.DB

func initDB() error {
	// 数据库连接配置
	dsn := "username:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return fmt.Errorf("failed to connect to database: %v", err)
	}
	fmt.Println("Database connected!")
	return nil
}

func main() {
	if err := initDB(); err != nil {
		fmt.Println(err)
		return
	}
}

四、定义模型

在 GORM 中,模型是与数据库表对应的结构体。以下是一个用户表模型示例:

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

GORM 根据模型的字段标签定义数据库的表结构。


五、自动迁移(AutoMigrate)

使用 GORM 的自动迁移功能,根据模型定义生成或更新数据库表:

func main() {
	if err := initDB(); err != nil {
		fmt.Println(err)
		return
	}

	// 自动迁移
	if err := db.AutoMigrate(&User{}); err != nil {
		fmt.Println("Failed to migrate database:", err)
		return
	}
	fmt.Println("Database migrated!")
}

六、实现增删改查操作

  1. 创建记录(Create)

通过 Create 方法插入一条记录:

func createUser() {
	user := User{
		Name:  "Alice",
		Email: "alice@example.com",
		Age:   25,
	}
	if err := db.Create(&user).Error; err != nil {
		fmt.Println("Failed to create user:", err)
	} else {
		fmt.Println("User created:", user)
	}
}

  1. 查询记录(Read)

查询单条记录:

func getUserByID(id uint) {
	var user User
	if err := db.First(&user, id).Error; err != nil {
		fmt.Println("User not found:", err)
	} else {
		fmt.Println("User found:", user)
	}
}

查询所有记录:

func getAllUsers() {
	var users []User
	if err := db.Find(&users).Error; err != nil {
		fmt.Println("Failed to fetch users:", err)
	} else {
		fmt.Println("All users:", users)
	}
}

  1. 更新记录(Update)

更新单个字段:

func updateUserEmail(id uint, newEmail string) {
	if err := db.Model(&User{}).Where("id = ?", id).Update("email", newEmail).Error; err != nil {
		fmt.Println("Failed to update user:", err)
	} else {
		fmt.Println("User email updated!")
	}
}

更新多个字段:

func updateUser(id uint, updates map[string]interface{}) {
	if err := db.Model(&User{}).Where("id = ?", id).Updates(updates).Error; err != nil {
		fmt.Println("Failed to update user:", err)
	} else {
		fmt.Println("User updated!")
	}
}

  1. 删除记录(Delete)

删除指定 ID 的记录:

func deleteUserByID(id uint) {
	if err := db.Delete(&User{}, id).Error; err != nil {
		fmt.Println("Failed to delete user:", err)
	} else {
		fmt.Println("User deleted!")
	}
}

七、完整代码示例

以下是将上述功能整合的完整代码:

package main

import (
	"fmt"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var db *gorm.DB

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

func initDB() error {
	dsn := "username:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return fmt.Errorf("failed to connect to database: %v", err)
	}
	fmt.Println("Database connected!")
	return nil
}

func main() {
	if err := initDB(); err != nil {
		fmt.Println(err)
		return
	}

	// 自动迁移
	if err := db.AutoMigrate(&User{}); err != nil {
		fmt.Println("Failed to migrate database:", err)
		return
	}

	// 增删改查操作示例
	createUser()
	getUserByID(1)
	getAllUsers()
	updateUserEmail(1, "newalice@example.com")
	deleteUserByID(1)
}

func createUser() {
	user := User{
		Name:  "Alice",
		Email: "alice@example.com",
		Age:   25,
	}
	if err := db.Create(&user).Error; err != nil {
		fmt.Println("Failed to create user:", err)
	} else {
		fmt.Println("User created:", user)
	}
}

func getUserByID(id uint) {
	var user User
	if err := db.First(&user, id).Error; err != nil {
		fmt.Println("User not found:", err)
	} else {
		fmt.Println("User found:", user)
	}
}

func getAllUsers() {
	var users []User
	if err := db.Find(&users).Error; err != nil {
		fmt.Println("Failed to fetch users:", err)
	} else {
		fmt.Println("All users:", users)
	}
}

func updateUserEmail(id uint, newEmail string) {
	if err := db.Model(&User{}).Where("id = ?", id).Update("email", newEmail).Error; err != nil {
		fmt.Println("Failed to update user:", err)
	} else {
		fmt.Println("User email updated!")
	}
}

func deleteUserByID(id uint) {
	if err := db.Delete(&User{}, id).Error; err != nil {
		fmt.Println("Failed to delete user:", err)
	} else {
		fmt.Println("User deleted!")
	}
}

八、总结

  1. 简洁性:GORM 提供了简洁的 API 和灵活的查询方式。
  2. 高效开发:通过模型定义和自动迁移,快速构建数据库结构。
  3. 可扩展性:支持复杂查询和事务操作,适用于小型项目和大型系统。

使用 GORM,可以极大提高 Go 开发过程中与数据库交互的效率,同时保持代码的简洁和可维护性。