Go入门-基于GORM框架的CRUD操作(mysql增删改查)

选择gorm框架的原因,在阅读了很多go语言数据库操作的文章之后,发现大多数使用的都是grom框架。然后我就去官方文档里面去学习用法,发现这是一个类似于Mybatis的框架,所以学起来也比较容易,因此分享一下使用的过程和学习心得。

目录

一、框架介绍

二、实现方法

1、连接配置

2、实体类

3、CRUD接口

(1)查询

(2)新增

(3)更新

(4)删除

三、运行调试

1、App.go函数代码

2、分步运行结果

(1)查询所有数据​​​​​​​

(2)根据主键查询

(3)根据名字模糊查询

 (4)新增

(5)更新

 (6)删除

 四、总结与一些发现的分享


一、框架介绍

官网传送门:https://gorm.io/zh_CN/docs/index.html

官网有很详细的介绍,这里不过多叙述。


二、实现方法

1、连接配置

先上代码

package config

import (
	"fmt"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var DB *gorm.DB

type attribute struct {
	driver   string
	url      string
	username string
	password string
	database string
}

type connect struct {
	at  attribute
	dsn string
}

func Mysql() {
	//读取文件
	viper.SetConfigFile("app.yml")
	fmt.Println("正在读取文件app.yml")

	//处理错误
	err := viper.ReadInConfig()
	if err == nil {
		fmt.Println("正在处理读取异常,无异常")
	}

	//属性读取并赋值
	var a = attribute{
		driver:   viper.GetString("mysql.driver"),
		url:      viper.GetString("mysql.url"),
		username: viper.GetString("mysql.username"),
		password: viper.GetString("mysql.password"),
		database: viper.GetString("mysql.database"),
	}
	fmt.Println("正在属性读取并赋值")

	//创建数据库连接
	var con = connect{
		at:  a,
		dsn: a.username + ":" + a.password + "@tcp(" + a.url + ")/" + a.database + "?charset=utf8mb4&parseTime=True&loc=Local",
	}
	fmt.Println("正在创建数据库连接")

	//连接语句
	DB, err = gorm.Open(mysql.Open(con.dsn), &gorm.Config{})
	if err == nil {
		fmt.Println("mysql连接成功")
	}
}

这里是通过viper函数来读取app.yml文件,这里注意一下yml文件的书写格式

mysql:
  driver: mysql
  url: your IP:port
  username: van
  ##这里的密码加上单引号才不会报错,不然不会被正常识别为字符串
  password: 'password'
  database: dbName

整体的代码还是比较易读的,这里不过多讲解过程,最后通过gorm.open函数进行数据库连接的建立。


2、实体类

这里与SpringMVC中的实体类一样,但是代码有些许不同。

type Users struct {
	Id       int    `json:"id"`
	Username string `json:"username"`
	Password string `json:"password"`
	Mid      int    `json:"mid"`
}

func (user Users) TableName() string {
	return "user"
}

需要注意的是struct下的字段名第一个字母需要大写,不然会报错,在GoLand他会变成橙色,也可以通过GoLand的提示一键修改。


3、CRUD接口

首先定义了两个结果对象,分别对应了某一条数据和某几条数据,这一点从定义上就可以看出来,主要用在后面函数返回的结果上。

var results []Users
var result Users

(1)查询

实现的过程比较简单,主要是grom框架将sql语句封装好了,我们只需要传入对象或者需要的值即可完成,值得注意的是&result前面的&,在java中写习惯之后好几次都忘记加了。

// FindAll 返回所有信息
func FindAll() []Users {
	config.DB.Find(&results)
	return results
}
// FindById 返回根据主键检索(一条数据)
func FindById(index int) Users {
	config.DB.First(&result, index)
	return result
}
// FindByName 条件查询
func FindByName(name string) []Users {
	config.DB.Where("username LIKE ?", "%"+name+"%").Find(&results)
	return results
}

(2)新增

这里为了了解新增语句的返回值中的属性,官方文档中指出的有新增数据的主键id、错误、影响行数,因此在这里定义了一个结构体用于把这些信息返回查看,当然也可以直接打印出来。

// Add 新增数据
func Add(users Users) struct {
	id  int
	err error
	row int64
} {
	r := config.DB.Create(&users)
	return struct {
		id  int
		err error
		row int64
	}{id: users.Id, err: r.Error, row: r.RowsAffected}
}

(3)更新

语句比较易读,主要就是设置更新的条件,这里我是选择传入一个对象的所有属性,但是只将ID作为判断条件,从而根据ID更新该条数据

// Update 根据主键修改数据
func Update(users Users) struct {
	row int64
	err error
} {
	r := config.DB.Model(Users{}).Where("id=?", users.Id).Updates(users)
	return struct {
		row int64
		err error
	}{row: r.RowsAffected, err: r.Error}
}

(4)删除

与前面类似

// 根据主键删除
func Delete(index int) struct {
	row int64
	err error
} {
	r := config.DB.Delete(&Users{}, index)
	return struct {
		row int64
		err error
	}{row: r.RowsAffected, err: r.Error}
}

三、运行调试

1、App.go函数代码

package main

import (
	"Server/config"
	"Server/model"
	"fmt"
)

// 启动函数,也可以将Mysql配置函数直接命名为init
// 会自动识别启动
func init() {
	config.Mysql()
}

func main() {
	//查询所有数据
	fmt.Println(model.FindAll())

	//根据主键查询
	fmt.Println(model.FindById(2))

	//根据名字模糊查询
	fmt.Println(model.FindByName("xiao"))

	NewUser := model.Users{
		Id:       20,
		Username: "TestName",
		Password: "test",
		Mid:      0,
	}

	//新增
	fmt.Println(model.Add(NewUser))

	UpdateUser := model.Users{
		Id:       20,
		Username: "TestName",
		Password: "NewPaaword",
		Mid:      0,
	}

	//更新
	fmt.Println(model.Update(UpdateUser))

	//删除
	fmt.Println(model.Delete(20))
}

2、分步运行结果

这里在使用GoLand的调试功能的时候出错了,因为我的电脑是m1,但是GoLand的版本不对,虽然其他的功能可以使用,但是这个功能用不了,于是我去官网重新下载了m1版本的替换了之后便可以进行断点调试了。

(1)查询所有数据

(2)根据主键查询

(3)根据名字模糊查询

 (4)新增

(5)更新

 (6)删除


 四、总结与一些发现的分享

有一个点是在mysql的配置函数启动时发现的,之前按照一片文章写了配置文件之后可以正常启动,但是这次我在自己写的过程中,总是出现一个说无指针的错误,只有在进行配置函数调用之后才不会报错,于是我进行了下面这样的编写

// 启动函数,也可以将Mysql配置函数直接命名为init
// 会自动识别启动
func init() {
	config.Mysql()
}

发现这样就用每次都在main函数调用配置函数了,然后我再去看之前的项目,他直接把配置函数名设置成了init,于是乎就可以自动调用。
这次分享了一些基于gorm框架的CRUD的操作的实现,在此基础之上接下来可以试着去写gin框架下的返回JSON数据的接口了。如果有叙述不准确的地方还请指出哈。


gitee项目源码:https://gitee.com/shenyufan/go-lang.git​​​​​​​

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 GORM 连接 MySQL 并进行增删改查的示例代码,已经注释说明每个步骤的作用。 ```go package main import ( "fmt" "gorm.io/driver/mysql" // 导入 MySQL 驱动 "gorm.io/gorm" // 导入 GORM ) type User struct { // 定义 User 结构体 gorm.Model // 继承 GORM 模型结构体,包含 ID、CreatedAt、UpdatedAt、DeletedAt 字段 Name string Age int } func main() { // 1. 连接 MySQL 数据库 dsn := "root:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } defer db.Close() // 程序结束时关闭数据库连接 // 2. 自动迁移数据表 db.AutoMigrate(&User{}) // 自动创建数据表 // 3. 插入数据 user := User{Name: "Tom", Age: 18} result := db.Create(&user) // 插入数据 if result.Error != nil { panic("failed to create user") } fmt.Println(user.ID) // 输出新插入数据的 ID // 4. 查询数据 var users []User db.Find(&users) // 查询所有数据 fmt.Println(users) var user2 User db.First(&user2, 1) // 根据主键查询单条数据 fmt.Println(user2) var user3 User db.Where("name = ?", "Tom").First(&user3) // 根据条件查询单条数据 fmt.Println(user3) // 5. 更新数据 db.Model(&user).Update("Age", 20) // 更新数据 fmt.Println(user) // 6. 删除数据 db.Delete(&user) // 删除数据 } ``` 注意,这里的 `dsn` 是连接 MySQL 数据库的字符串,其中包含了用户名、密码、主机地址、端口号、数据库名等信息,需要根据实际情况进行修改。同时,这里使用了 GORM 的链式查询语法,通过 `db.Find()` 和 `db.Where()` 方法来查询数据,可以根据实际需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值