GORM连接数据库及增删改查 | 青训营;

76 阅读6分钟

引用

GORM的官方文档 gorm.cn/docs/

中文版:gorm.cn/zh_CN/docs/

一、介绍

1.简介

GORM是Go语言的一个ORM(Object Relational Mapping)库,其实就是我们可以通过这个库用go语言来操作数据库里的数据,ORM也就是对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型的数据之间的转换

2.特性

  • 全功能 ORM

  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)

  • Create,Save,Update,Delete,Find 中钩子方法

  • 支持 PreloadJoins 的预加载

  • 事务,嵌套事务,Save Point,Rollback To Saved Point

  • Context,预编译模式,DryRun 模式

  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD

  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询

  • 复合主键,索引,约束

  • Auto Migration

  • 自定义 Logger

  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…

  • 每个特性都经过了测试的重重考验

  • 开发者友好

二、数据库的连接

1.创建Schema

  1. 先是得下载好相关数据库,GORM支持的数据库就:sqlite、mysql、postgres、sqlserver,这里我用到的是mysql,下载好并且配置好相关环境,在cmd控制窗口输入 mysql -u root -p,然后输入自己的密码进入到自己的数据库
  2. 进入到MySQL之后,我们就可以创建一个数据库db1,先是通过create创建一个数据库,然后设置对应的一些属性,character就是设置字符的范围,utf8mb4就已经是MySQL可以支持的最大字符集,然后collate就是用来设置排序,general_ci就是排序中大小写不敏感的一种规则
create database db1
character set = utf8mb4
collate = utf8mb4_general_ci;

3.最后我们可以给我们的数据库初始化一些表单数据,我们得先进入到我们建立的数据库内,直接use语句就可以,use db1;,然后就可以通过create table user()来创建一个表单,这里的user只是一个举例,可以根据自己的需求更改

2.导包

创建完之后就是导入我们所需要的包,在导入之前,我们得先获取,在终端输入:

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

这里分别导入的是gorm,和gorm驱使的mysql,然后就可以直接导包了

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

注意:这里不要和"github.com/jinzhu/gorm"冲突了,这个和"gorm.io/gorm"不能共存,两者选一个

3.连接数据库

导入完包之后,我们就可以连接数据库了,连接的话要按照一定的格式来,具体如下:

	dsn := "root:password@tcp(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

这里需要注意的就是dsn这里,这个格式是"MysqlName:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local",这里的MySqlName就是我们mysql的名字,下载这个mysql的时候设定的,一般默认是为root,password就是进入的密码,这个tcp就也是下载的时候设定的,但是一般都不会更改,都是默认为这个,database就是我们自己创建的数据库,就是刚刚的db1,然后charset就是字符编码范围,要和创建数据库时一致,刚刚在创建时也设置了,parseTime就是为了正确的处理time.Time,最后loc就是位置,都是本地

三、增删改查的实现

1.Create

首先是创建和插入,GORM提供了create方法,我们直接使用就行,我们可以插入一个也可以插入多个,具体如下:

package main

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

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

func main() {
	dsn := "root:password@tcp(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{)})
	if err != nil {
		panic("failed to connect database")
	}
	user := Users{Name: "张三", Age: 24}
	db.Create(&user)
	users := []Users{{Name: "李四", Age: 21}, {Name: "王五", Age: 23}, {Name: "赵六", Age: 25}}
	db.Create(&users)

先是定义了一个Users的结构体,然后在里面还嵌入了GORM定义的一个结构体,这个结构体内包含ID,CreatedAt、Updated、DeletedAt,接着就是在主函数内就是先连接了我们自己的数据库,然后通过Create()方法将定义的结构体user和users都插入进去,如果插入成功,运行之后会出现对应信息

2.Quiry

然后就是查询,查询主要涉及的方法是First(),Last(),Find()三个方法

  1. First(),也就是:db.First(&users)查询数据库表内的第一条数据,这里的users一定是得前面有创建,上面代码中有声明这个users,然后通过取地址符找到对应的地址,就能找到整个一个表的地址,最后就能找到表内的第一个数据
  2. Last(),也就是:db.Last(&users),这个就是寻找表内的最后一条数据,与First()方法同理
  3. Find(),这个方法比较常用,可以直接查询,就比如:db.Find(&users, "name = ?", "张三"),这里就从表里寻找name=张三的数据,也可以加上where来查询,就比如:db.Where("name= ?", "李四").Find(&users),是同样的意思,就是从表里寻找name=李四的数据,都可以用来查找,具体很多的查找的细节可以在官方文档中查询

3.Update

接着就是修改更新,这个也是有对应的方法,涉及的方法有Save(),Update()

  1. Save(),就是用来保存当前的数据,即使为零值也会保存,具体如:db.Save(&user),如果保存成功,运行会有Update 相应数据的字样在控制台输出
  2. Update(),就是用来更新数据,可以用来更新单列数据,也可以更新多列数据,这里以单列数据为例,单列数据的更新需要加上条件,这样才能锁定对应数据然后进行更新,具体如: db.Model(&user).Update("name", "hello"),这个就是将user对应的name改为hello,上面的user结构体声明的name为张三,在这里改为了hello,也可以通过where来控制条件来更新,就比如:db.Model(&users).Where("age>?", 10).Update("name", "world"),也就是将users结构体内年龄大于10的name都更新为world

4.Delete

最后就是删除,删除的话就常用的就是Delete()方法

Delete(),用来删除数据,可以删除单条也可以删除指定数据,删除单条时,被删除的对象需要指定主键,否则会触发批量删除,具体如:db.delete(&user),也可以带着额外条件的删除,具体如:db.Where("name = ?", "张三").Delete(&user),删除name为"张三"的数据

四、总结及建议

1.总结

这部分主要是学习了什么是GORM,然后如何用GORM,连接数据库,以及就是增删改查的初级用法。首先连接数据库就要按照一定的格式,然后得提前创建一个数据库并且初始化。增删改查则是GROM提供了对应的方法,直接用就行,只是需要注意其中的用法,以及方法中参数的含义

2.建议

刚入门的话就最好先学习一下数据库的知识,先了解数据库的基本知识,然后学习这个框架的话最主要的是要自己去实践去操作,然后就是查阅官方的文档,我对这部分知识也只是刚入门的程度,多多研究官方的文档,其中增删改查的细节在文档中有很多,都是要自己去实操一下才能彻底知道其用途