GORM(Go 的 ORM 库)连接数据库具体过程 | 青训营

63 阅读4分钟

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

本文将介绍如何使用 GORM,一个 Go 语言的 ORM(对象关系映射)库,来连接数据库,并实现常用的增删改查操作。

准备工作

首先,你需要安装 GORM 库,可以通过以下命令进行安装:

go get -u gorm.io/gorm

同时还需要安装相应的数据库驱动,GORM 支持多种数据库,比如 MySQL、PostgreSQL 等。在这篇文章中,我们以 MySQL 数据库为例。你可以通过以下命令安装 MySQL 驱动:

go get -u gorm.io/driver/mysql

连接数据库

首先,我们需要建立数据库连接,并创建一个新的 GORM 实例。在代码中可以这样实现:

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

func ConnectDB() (*gorm.DB, error) {
	dsn := "your-database-connection-string" // 替换成你自己的数据库连接字符串
	
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return nil, err
	}
	
	return db, nil
}

dsn 变量中,你需要填写你自己的数据库连接字符串。例如,在本地开发环境下,你可以填写类似于 user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local 的连接字符串。

定义模型

接下来,我们需要定义数据库中的表结构对应的 Go 语言结构体。例如,我们创建一个 User 结构体来表示一个用户对象:

type User struct {
    gorm.Model
    Name string
    Age  int
}

在这里,我们借助了 GORM 提供的 gorm.Model 来自动生成 ID、创建时间、更新时间和删除时间等字段。

创建记录

要在数据库中插入一条新纪录,我们可以使用以下方式:

func CreateUser(db *gorm.DB, name string, age int) error {
    user := User{
        Name: name,
        Age:  age,
    }
    
    result := db.Create(&user)
    if result.Error != nil {
        return result.Error
    }
    
    return nil
}

在这个例子中,我们使用了 db.Create 方法来插入一条新记录,并将错误返回。

查询记录

查询是使用 ORM 最常用的功能之一。下面是一个查询所有用户记录的示例:

func GetAllUsers(db *gorm.DB) ([]User, error) {
    var users []User
    
    result := db.Find(&users)
    if result.Error != nil {
        return nil, result.Error
    }
    
    return users, nil
}

在上述代码中,我们使用了 db.Find 方法来查询出所有的用户记录。

还可以通过 GORM 提供的条件查询方法来实现根据特定条件查询记录,例如:

func GetUsersByName(db *gorm.DB, name string) ([]User, error) {
    var users []User
    
    result := db.Where("name = ?", name).Find(&users)
    if result.Error != nil {
        return nil, result.Error
    }
    
    return users, nil
}

在上述代码中,我们使用了 db.Where 方法来指定查询条件,并通过 ? 占位符来传递参数值。

更新记录

想要更新数据库中的一条记录,可以使用以下方式:

func UpdateUser(db *gorm.DB, id uint, name string, age int) error {
    user := User{
        Model: gorm.Model{ID: id},
    }
    
    updateData := map[string]interface{}{
        "Name": name,
        "Age":  age,
    }
    
    result := db.Model(&user).Updates(updateData)
    if result.Error != nil {
        return result.Error
    }
    
    return nil
}

在这个例子中,我们首先通过用户的 ID 创建一个空的 User 对象,然后使用 db.Model 指定更新对象的模型,接着调用 Updates 方法来更新相关字段的值。

删除记录

删除数据库中的一条记录可以使用以下方法:

func DeleteUser(db *gorm.DB, id uint) error {
    user := User{
        Model: gorm.Model{ID: id},
    }
    
    result := db.Delete(&user)
    if result.Error != nil {
        return result.Error
    }
    
    return nil
}

在这个示例中,我们通过用户的 ID 创建一个空的 User 对象,并通过 db.Delete 方法来删除该对象。

使用示例

下面是一个完整的使用示例,演示了如何连接数据库并执行增删改查操作:

package main

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

type User struct {
	gorm.Model
	Name string
	Age  int
}

func ConnectDB() (*gorm.DB, error) {
	dsn := "your-database-connection-string"
	
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return nil, err
	}
	
	return db, nil
}

func CreateUser(db *gorm.DB, name string, age int) error {
	user := User{
		Name: name,
		Age:  age,
	}
	
	result := db.Create(&user)
	if result.Error != nil {
		return result.Error
	}
	
	return nil
}

func GetAllUsers(db *gorm.DB) ([]User, error) {
	var users []User
	
	result := db.Find(&users)
	if result.Error != nil {
		return nil, result.Error
	}
	
	return users, nil
}

func UpdateUser(db *gorm.DB, id uint, name string, age int) error {
	user := User{
		Model: gorm.Model{ID: id},
	}
	
	updateData := map[string]interface{}{
		"Name": name,
		"Age":  age,
	}
	
	result := db.Model(&user).Updates(updateData)
	if result.Error != nil {
		return result.Error
	}
	
	return nil
}

func DeleteUser(db *gorm.DB, id uint) error {
	user := User{
		Model: gorm.Model{ID: id},
	}
	
	result := db.Delete(&user)
	if result.Error != nil {
		return result.Error
	}
	
	return nil
}

func main() {
	db, err := ConnectDB()
	if err != nil {
		fmt.Println("Failed to connect database:", err)
		return
	}
	defer db.Close()
	
	err = db.AutoMigrate(&User{})
	if err != nil {
		fmt.Println("Failed to migrate table:", err)
		return
	}
	
	err = CreateUser(db, "Alice", 20)
	if err != nil {
		fmt.Println("Failed to create user:", err)
		return
	}
	
	users, err := GetAllUsers(db)
	if err != nil {
		fmt.Println("Failed to get all users:", err)
		return
	}
	fmt.Println("All Users:", users)
	
	err = UpdateUser(db, 1, "Bob", 25)
	if err != nil {
		fmt.Println("Failed to update user:", err)
		return
	}
	
	err = DeleteUser(db, 1)
	if err != nil {
		fmt.Println("Failed to delete user:", err)
		return
	}
}

在这个示例中,我们首先连接数据库,然后创建一个表 User 来存储用户信息。接着,我们插入一条新的用户记录,并查询出所有用户。之后,我们更新了用户记录的字段值,并最终删除了该用户。

通过以上步骤,你就可以使用 GORM 连接数据库并实现增删改查操作了。当然,GORM 提供了更强大的功能,比如事务支持、表关联等,可以根据具体需求进一步学习和使用。请注意遵守相关法律法规,合法合规地使用数据库和 ORM 工具。