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

65 阅读2分钟

#使用GORM实现增删改查

准备工作

  1. 安装并启动mysql

由于我本地已经配置好mysql,因此直接启动net start mysql

  1. 初始化代码仓库

mkdir gorm_project

cd gorm-project

go mod init main

  1. 导入gorm框架以及mysql驱动

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

新建main.go文件

实现

  1. 连接数据库

    gorm库使用dsn作为连接数据库的参数,dsn翻译过来就叫数据源名称,用来描述数据库连接信息。一般都包含数据库连接地址,账号,密码之类的信息。

    DSN格式:

    [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

var db *gorm.DB
var err error
dsn := "root:122588@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    panic("连接失败")
}

  1. 定义表model

    在golang中gorm模型定义是通过struct实现的,这样我们就可以通过gorm库实现struct类型和mysql表数据的映射。gorm负责将对模型的读写操作翻译成sql语句,然后gorm再把数据库执行sql语句后返回的结果转化为我们定义的模型对象。

type User struct{
	gorm.Model
	Id int `gorm:"primaryKey;autoIncrement"`
	Name string
	Age int
}

//运行模型迁移,此时就把表创建好了
db.AutoMigrate(&User{})

使用gorm.Moder,在创建的时候gorm会自动添加created-atdeleted_atupdated_at三个列,对应着创建时间,删除时间(软删除),更新时间 image.png

  1. 增删改查
func createUser(db *gorm.DB, name string, age int) {
    user := User{Name: name, Age: age}
    db.Create(&user)
}

使用gorm的Create方法增加一个User,将user对象转换为sql语句插入到表中

func deleteUser(db *gorm.DB, id int) error {
   user, err := getUser(db, id)
   if err != nil {
       return err
   }
   res := db.Delete(&user)
   return res.Error
}

使用gorm的Delete方法即可把指定的user删除,Delete方法还可以使用id删除等

func updateUser(db *gorm.DB, id int, name string, age int) error {
    user, err := getUser(db, id)
    if err != nil {
	return err
    }
    user.Name = name
    user.Age = age
    res := db.Save(&user)
    return res.Error
}

使用gorm的Save方法,将user存入数据库中,这样会覆盖数据中user的数据,即可完成更新操作

   func getUser(db *gorm.DB, id int) (User, error) {
   var user User
   result := db.First(&user, id)
   if result.Error != nil {
   	return user, result.Error
   }
   return user, nil
   }

使用gorm的First方法即可在数据库中查询到指定id的user数据

完整代码


package main

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

type User struct{
	gorm.Model
	Id int `gorm:"primaryKey;autoIncrement"`
	Name string
	Age int
}

var db *gorm.DB

func createUser(db *gorm.DB, name string, age int) {
	user := User{Name: name, Age: age}
	db.Create(&user)
}

func getUser(db *gorm.DB, id int) (User, error) {
	var user User
	result := db.First(&user, id)
	if result.Error != nil {
		return user, result.Error
	}
	return user, nil
}

func updateUser(db *gorm.DB, id int, name string, age int) error {
	user, err := getUser(db, id)
	if err != nil {
		return err
	}
	user.Name = name
	user.Age = age
	res := db.Save(&user)
	return res.Error
}

func deleteUser(db *gorm.DB, id int) error {
	user, err := getUser(db, id)
	if err != nil {
		return err
	}
	res := db.Delete(&user)
	return res.Error
}

func main(){
	var err error
	dsn := "root:122588@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接失败")
	}
	db.AutoMigrate(&User{})

	//增
	createUser(db,"顶针",20)
	createUser(db,"芙蓉王",21)

	//查
	user, err := getUser(db,1)
	if err != nil {
		panic(err)
	}
	fmt.Println(user)
	
	//改
	err = updateUser(db,1,"顶针",21)
	if err != nil {
		panic(err)
	}
	fmt.Println(getUser(db,1))

	//删
	err = deleteUser(db,1)
	if err != nil {
		panic(err)
	} 
}

运行测试

image.png

image.png