使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作 | 青训营

81 阅读4分钟

首先我们需要了解一下gorm的约定

约定

GORM 倾向于约定优于配置 默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间

注意结构体字段的首字母需要大写,小写不能导入

如果您遵循 GORM 的约定,您就可以少写的配置、代码。 如果约定不符合您的实际要求,GORM 允许你配置它们。

蛇形约定:可以看到之前我们创建的struct是type Product struct,而在数据库生成的表名为products

image.png

图片出处:原文链接:blog.csdn.net/qq23001186/…

  • gorm.Model:GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
    • 可以自定义TAG,如gorm:"primaryKey" -> 主键;gorm:"index" -> 索引
// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

连接MYSQL数据库

首先,我们需要有一个数据库,我的数据库是MYSQL 8.0.33

可在官网上自行下载

同时,我采用Navicat Premium 15图形化界面辅助来观测数据库

此处省略下载这两个软件的步骤,以及连接这两个软件的步骤

下面我们在Navicat Premium 15软件中新建一个数据库

右键新建的连接显示如下:->点击新建数据库

输入数据库名字:gorm_class,以及选择编码方式utf8mb4,不用输入排序规则,点击确认即可

如图为建立成功的标志:

在终端运行

go get -u gorm.io/gorm

go get -u gorm.io/driver/mysql

然后就可以import导入了

将下面代码账号密码和数据库名改成自己设置的,运行代码即可成功连接上数据库

package main

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

func main() {
	//配置MySQL连接参数
	username := "root"     //账号
	password := "123456"   //密码
	host := "127.0.0.1"    //数据库地址,可以是Ip或者域名
	port := 3306           //数据库端口
	Dbname := "gorm_class" //数据库名
	timeout := "10s"       //连接超时,10秒

	//拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
	//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
	_, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}
  
}

注意上文出现的变量如果下文不用就会报错,即上文的_变成其他字母变量

连接数据库失败的结果

image.png 连接数据库成功

image.png

实现增删改查

package main

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

// 定义表机构类型的结构体
// 跟表对应的字段,注意结构体字段的首字母需要大写,小写不能导入
type User struct {
	//gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
	gorm.Model
	Username string
	Email    string
}

func main() {

	//配置MySQL连接参数
	username := "root"     //账号
	password := "123456"   //密码
	host := "127.0.0.1"    //数据库地址,可以是Ip或者域名
	port := 3306           //数据库端口
	Dbname := "gorm_class" //数据库名
	timeout := "10s"       //连接超时,10秒

	//拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
	//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}

	//延时关闭数据库连接
	//defer db.Close()

	// 创建表和进行迁移
	db.AutoMigrate(&User{})
	// 创建记录
	createUser(db, "uuuuu", "jiaojiao@example.com")
	// 查询记录
	user, err := getUserByID(db, 1)
	if err != nil {
		panic(err)
	}
	fmt.Println(user.Username, user.Email)
	// 更新记录
	err = updateUserEmail(db, 1, "newemail@example.com")
	if err != nil {
		panic(err)
	}
	// 删除记录
	err = deleteUser(db, 1)
	if err != nil {
		panic(err)
	}
}
func createUser(db *gorm.DB, name, email string) {
	user := User{Username: name, Email: email}
	db.Create(&user)
}

// 第一个括号表示传入的数据,第二个括号表示要返回的数据
func getUserByID(db *gorm.DB, id uint) (User, error) {
	var user User
	result := db.First(&user, id)
	if result.Error != nil {
		return user, result.Error
	}
	return user, nil
}

func updateUserEmail(db *gorm.DB, id uint, email string) error {
	user, err := getUserByID(db, id)
	if err != nil {
		return err
	}
	user.Email = email
	result := db.Save(&user)
	return result.Error
}

func deleteUser(db *gorm.DB, id uint) error {
	result := db.Delete(&User{}, id)
	return result.Error
}

运行结果:

image.png 查看Navicat Premium 15,自动新建users数据库,成功!

image.png