选择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​​​​​​​

原文地址:https://blog.csdn.net/m0_57949886/article/details/129403886

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_47120.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注