GORM 快速入门最佳实践(含有样例数据库)_Ast2risK的博客-CSDN博客_gorm


本站和网页 https://blog.csdn.net/Lance_Yuan24/article/details/124851367 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

GORM 快速入门最佳实践(含有样例数据库)_Ast2risK的博客-CSDN博客_gorm
GORM 快速入门最佳实践(含有样例数据库)
Ast2risK
已于 2022-12-22 16:50:30 修改
3381
收藏
分类专栏:
Golang
文章标签:
数据库
database
sql
go
golang
于 2022-05-18 21:19:01 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Lance_Yuan24/article/details/124851367
版权
Golang
专栏收录该内容
16 篇文章
1 订阅
订阅专栏
在听完金柱老师对 GORM 的讲解后,我对于 GORM 的理解更深一层,又回忆到学习 GORM 时网络上基本没有带样例数据库的教程,所以在今天带着样例数据库写一篇GORM的简单入门教程(基础使用)
我所展示的实现效果与代码可能会有一定出入,这是因为我展示中的数据库模型更加完善但不适合教程使用,但是不妨碍学习
数据库建立
在使用 GORM 之前我们需要把样例数据库先创建好,我一般不用 GORM 的建库方法,更常用手动建库。因为我们是基础使用,所以数据库也并不复杂,即一个简单的选课系统数据库。
课程表
CREATE TABLE `course`
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`Name` varchar(20) NOT NULL,
`Credit` float NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
专业表
CREATE TABLE `major`
`MajorNum` bigint(20) NOT NULL,
`MajorName` varchar(20) NOT NULL,
PRIMARY KEY (`MajorNum`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
学生表
CREATE TABLE `student`
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`Name` varchar(10) NOT NULL,
`Password` varchar(20) DEFAULT NULL,
`MajorNum` bigint(20) DEFAULT NULL,
`Identity` tinyint(4) DEFAULT '1',
`Credit` float DEFAULT '0',
PRIMARY KEY (`Id`),
KEY `MajorNum` (`MajorNum`),
CONSTRAINT `student_ibfk_1` FOREIGN KEY (`MajorNum`) REFERENCES `major` (`MajorNum`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
学生课程表
CREATE TABLE `stu_course`
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`StudentNum` bigint(20) NOT NULL,
`TCourseNum` bigint(20) NOT NULL,
`Grade` varchar(10) DEFAULT '暂未上传',
`Time` varchar(20) DEFAULT NULL,
PRIMARY KEY (`Id`),
KEY `StudentNum` (`StudentNum`),
KEY `stu_course_ibfk_2` (`TCourseNum`),
CONSTRAINT `stu_course_ibfk_1` FOREIGN KEY (`StudentNum`) REFERENCES `student` (`Id`),
CONSTRAINT `stu_course_ibfk_2` FOREIGN KEY (`TCourseNum`) REFERENCES `t_course` (`Id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
老师表
CREATE TABLE `teacher`
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`Name` varchar(10) NOT NULL,
`Password` varchar(20) NOT NULL,
`Identity` tinyint(4) DEFAULT '2',
PRIMARY KEY (`Id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
老师课程表
CREATE TABLE `t_course`
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`CourseNum` bigint(20) NOT NULL,
`TeacherNum` bigint(20) NOT NULL,
`Time` varchar(255) DEFAULT NULL,
`Num` int(11) DEFAULT '0',
`Total` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`),
KEY `CourseNum` (`CourseNum`),
KEY `TeacherNum` (`TeacherNum`),
CONSTRAINT `t_course_ibfk_1` FOREIGN KEY (`CourseNum`) REFERENCES `course` (`Id`),
CONSTRAINT `t_course_ibfk_2` FOREIGN KEY (`TeacherNum`) REFERENCES `teacher` (`Id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
这个数据库建的非常基础,也没有太多的高级操作,所以也不需要一一介绍了,大家可以直接在本地复制代码到终端建表。
GORM 的简单使用
GORM 的连接
var db *gorm.DB
func InitGormDB() (err error) {
dB, err := gorm.Open(mysql.New(mysql.Config{
DSN: fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
global.Settings.GormInfo.Name, global.Settings.GormInfo.Password, global.Settings.GormInfo.Host, global.Settings.GormInfo.Port, global.Settings.GormInfo.DBName), // DSN data source name
DefaultStringSize: 171,
DisableDatetimePrecision: true,
DontSupportRenameIndex: true,
}), &gorm.Config{
SkipDefaultTransaction: false,
DisableForeignKeyConstraintWhenMigrating: true,
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
fmt.Printf("连接失败:%v\n", err)
db = dB
return err
其中使用的非常多的配置,由于配置数量太多,建议大家到官方文档或源码中进行进一步的了解。
这里再把 GORM的中文文档 放出来,大家如果在接下来有什么没看懂的地方建议去中文文档中仔细阅读。
因为我们只是简单的使用教程,所以我们就不以表为单位来进行讲解,而是以 GORM 的功能使用为单位。
所谓常用,增删改查肯定是必不可少的,我们现在就从增删改查开始说起。
数据的增加(插入)
我们直接以学生为例,学生在注册好之后需要将数据放入数据库中,所以我们在 data access object 层中(也可以叫其他层)中进行 GORM 的插入操作。
func InsertStu(user model.Student) error {
deres := db.Select("Name", "Password", "MajorNum").Create(&model.Student{Name: user.Name, Password: user.Password, MajorNum: user.MajorNum})
err := deres.Error
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return err
return err
值得一提的是 model.Student 为学生的相关模型,模型的建立依照上面的数据库建立规范实现,但是 GORM 本身会有非常多的配置,所以你在编写模型层的时候要注意 gorm 标签的使用。
一个例子
type Student2TInfo struct {
Id int
Name string
MajorNum int `gorm:"column:MajorNum"` //自定义列名
//自定义表名
func (Student2TInfo) TableName() string {
return "student"
回到正题,我们在 main 函数中插入数据并调用 InsertStu 后,数据库中就会产生这一条数据。
数据的删除
删除非常的简单也没什么需要细说的地方。
下面的例子是删除老师的课程。
func DeleteTCourse(id int) error {
var Course []model.TCourse
dbRes := db.Where("Id = ?", id).Delete(&Course)
err := dbRes.Error
if err != nil {
fmt.Printf("delete failed, err:%v\n", err)
return err
return err
其中 model.TCourse 可以参考上面数据库的设计。
数据的更改
下面的例子是更改学生的密码
func UpdateStuPassword(id int, newPassword string) error {
deRes := db.Model(&model.Student{}).Where("Id = ?", id).Update("Password", newPassword)
err := deRes.Error
if err != nil {
fmt.Printf("update failed, err:%v\n", err)
return err
return err
数据的查询
下面的例子是通过学生的 ID 查询密保的问题。
func SelectQuestionByStuId(id int) string {
user := model.Student{}
db.Model(&model.Student{}).Select("question").Where("Id = ?", id).Find(&user)
return user.Question
至此增删改查功能基本实现就到此为止,接下来我们一起来看看更加高级的操作。
数据的一对多,多对多…
我们直接上代码
func SelectStuCourse(id int) ([]model.StuCourseInfo, error) {
var Course []model.StuCourseInfo
dbRes := db.Debug().Where("StudentNum = ?", id).Preload("TCourseInfo").Preload("TCourseInfo.CourseInfo").Preload("TCourseInfo.TeacherInfo").Find(&Course)
err := dbRes.Error
return Course, err
首先,这是通过 ID 查询学生选课信息的函数。
这个函数中最主要的就是使用了 Preload 预加载,我们Postman 上看看效果。
会一个接一个的响应出来,而这样一对多的实现方法就是 gorm 中的 preload 预加载。
代码和效果都看完了,我们现在来看看他的模型是怎么样的,是如何设计才能程序这样的效果呢,这里我们把这个实现的所有模型都给到。
type StuCourseInfo struct {
TCourseNum int `gorm:"column:TCourseNum"`
Grade string
Time string
TCourseInfo []TCourseInfo `gorm:"foreignKey:Id;references:TCourseNum"`
func (StuCourseInfo) TableName() string {
return "stu_course"
type TCourseInfo struct {
Id int
CourseNum int `gorm:"column:CourseNum"`
TeacherNum int `gorm:"column:TeacherNum"`
Num int
CourseInfo Course `gorm:"foreignKey:Id;references:CourseNum"`
TeacherInfo TeacherInfo2 `gorm:"foreignKey:Id;references:TeacherNum"`
func (TCourseInfo) TableName() string {
return "t_course"
type TeacherInfo2 struct {
Id int
Name string
func (TeacherInfo2) TableName() string {
return "teacher"
type Course struct {
Id int
Name string
Credit float64
通过这几个模型就可以使用 preload 预加载实现一对多,多对多,只要我们将标签中的外键约束确立好就可以轻松实现。
事务的实现
使用了 ORM 那哪能不用到事务呢,直接上代码
func InsertStuCourse(course model.StuCourse, credit float64) error {
stu := model.Student{}
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Select("StudentNum", "TCourseNum", "Time").Create(&model.StuCourse{StudentNum: course.StudentNum, TCourseNum: course.TCourseNum, Time: course.Time}).Error; err != nil {
return err
if err := tx.Model(&model.TCourse{}).Where("id = ?", course.TCourseNum).Update("Num", gorm.Expr("Num + 1")).Error; err != nil {
return err
if err := tx.Model(&model.Student{}).Where("id = ?", course.StudentNum).Update("Credit", gorm.Expr("Credit + ?", credit)).Error; err != nil {
return err
if err := tx.Model(&model.Student{}).Select("Credit").Where("id = ?", course.StudentNum).Find(&stu).Error; err != nil {
return err
fmt.Println(stu.Credit)
if stu.Credit >= 28 {
tx.Rollback()
return nil
})
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return err
return err
这个事务调用后能够实现学生选课,除此之外还会使那门课程的选课人数加一,学生选课总学分增加(防止超学分),使用了事务过后就能保证他的一致性,出错即回滚。
总结
以上则是gorm的简单使用,若有更多需求请去中文文档学习或查看源码,若有不懂的地方请留言,我看到了就会答复。
这是我的GitHub主页 https://github.com/L2ncE
欢迎 Follow、Star
关注博主即可阅读全文
Ast2risK
关注
关注
点赞
收藏
打赏
评论
GORM 快速入门最佳实践(含有样例数据库)
在听完JINZHU老师对GORM的讲解后,我对于GORM的理解更深一层,有回忆到学习GORM时网络上基本没有带样例数据库的教程,所以在今天带着样例数据库写一篇GORM的简单入门教程(基础使用)我所展示的实现效果与代码可能会有一定出入,这是因为我展示中的数据库模型更加完善但不适合教程使用,但是不妨碍学习。
复制链接
扫一扫
专栏目录
go mysql orm_golang常用库之操作数据库的orm框架-gorm基本使用详解
weixin_29085151的博客
01-26
750
一:字段映射-模型定义gorm中通常用struct来映射字段. gorm教程中叫模型定义比如我们定义一个模型Model:type User struct {gorm.ModelUserId int64 `gorm:"index"` //设置一个普通的索引,没有设置索引名,gorm会自动命名Birtheday time.TimeAge int `gorm:"column:age"`//colum...
gorm的简单使用
weixin_44178366的博客
06-28
631
GORM的基本使用
The fantastic ORM library for Golang aims to be developer friendly.
1.GORM连接mysql的基本使用
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
// UserInfo 对应数据表
type UserInfo struct {
ID uint
Name
评论 1
您还未登录,请先
登录
后发表或查看评论
gorm Preload与Joins带条件查询--闭坑指南与示例
最新发布
dorlolo的博客
11-09
359
1. Preload
1.1 Preload 带条件查询
2 Joins
2.1 Joins 带条件查询
2.2 Joins 模糊查询
2.3 使Joins支持一对多关系的查询
2.4 Joins方法的错误示范
gorm---最全讲解
最爱松露巧克力
09-13
6307
GORM使用指南
官方文档
目录
1.安装gorm
2.连接数据库
2.1 MySQL
2.2 PostgreSQL
2.3 Sqlite3
2.4 不支持的数据库
3.模型
3.1 模型定义
3.2 结构标签
3.2.1 提供的结构标签
3.2.2 关联的结构标签
4 约定
4.1 gorm.Model
4.2 ID为默认主键
4.3 多元化表名
4.4 ...
go sqlite mysql_Golang数据库编程之GORM库入门
weixin_42128676的博客
01-26
882
在上一篇文章中我们讲解了使用Go语言的标准库sql/database包操作数据库的过程,虽然使用sql/database包操作数据也是挺方便的,但是需要自己写每一条SQL语句,因此我们可能会自己再度进行封装,以便更好地使用,而使用现有Go语言开源ORM框架则是代替自己封装的一个更好的方式。ORM,即对象关系映射(Object Relational Mapping),可以简单理解为将关系型数据库中的...
gorm小技巧
qq_53651651的博客
02-27
638
编撰人:问冰
编撰时间:2022 年 2 月 27 日
当前版本:v1.1
例子表:
users:
一.如何查看gorm生成的sql语句
直接上例子:
stmt := db.Session(&gorm.Session{DryRun: true}).Where("id = ?", 1).First(&User{}).Statement
sql := stmt.SQL.String()
println(sql)
结果:SELECT * FROM `users` WHERE id = ? .
golang学习之gorm(一):Gorm介绍
热门推荐
浅弋、璃鱼的博客
11-15
2万+
文章目录一、gorm介绍:1. 什么是orm?2. gorm3.安装4.官方文档:
一、gorm介绍:
1. 什么是orm?
Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库
它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
2. gorm
1.Golang写的,GitHub上活跃度很高的orm库
2.特点:
全功能ORM;
关联(包含
一文详解Gorm
go|Python的个人博客
09-04
726
ORM是“对象-关系-映射”的简称,Go语言中常用的ORM框架有很多,如gorm、facebook-ent、xorm、upper/db、gorose等,这里以gorm为例。gorm注: 本文内容基于官方文档, 由于迭代原因,建议以最新官方文档为主老牌国产Golang orm框架。支持主流关系型数据库。中文文档适合新人入手,国内使用较多。最新版本2.x,比1.x有较大改动注意:Gorm最新地址为https://github.com/go-gorm/gorm,之前https://github.com/jinz
GORM教程
weixin_44961320的博客
07-26
841
gorm基本使用
qq_25856179的博客
06-28
918
文章目录gorm基本使用连接数据库表操作创建表删除表增删改查插入数据查询数据更新数据删除内容
gorm基本使用
gorm框架是go的一个数据库连接及交互框架,一般用于连接关系型数据库。
安装gorm,使用命令安装:
go get -u -v github.com/jinzhu/gorm
连接数据库
构建连接的目标为数据库中某一个库,同大多数框架一样使用url进行连
Gorm的简单使用
iGD_Hz的博客
05-27
449
Gorm特性
全特性 ORM (几乎包含所有特性)
模型关联 (一对一, 一对多,一对多(反向), 多对多, 多态关联)
钩子 (Before/After Create/Save/Update/Delete/Find)
预加载
事务
复合主键
SQL 构造器
自动迁移
日志
基于GORM回调编写可扩展插件
全特性测试覆盖
开发者友好
Gorm安装
go get -u gorm.io/gorm
Gorm连接数据库
Gorm的github网址
Gorm目前支持的数据库:
Mysql数据库。Mysql
gin框架下Gorm查询技术全面讲解示例
PHP、go程序员实例学习记录
01-21
1808
Gorm查询全面技术讲解示例
gorm验证实例
dibao6752的博客
12-04
257
gorm验证实例
本次通过第三方组建完成MySQL数据库的访问。
这里有一个比较特别的地方,在数据库连接部分,数据库是长连接的情况;
但是这里有一个问题, 即数据库关闭部分存在问题,暂时没有看到在什么地方关闭;
在controller层增加一个接口,用于进程关闭。
为什么不自己调用MySQL数据库的接口?采用gorm的接口呢?
gorm可以实现 struct mapping to da...
GORM的简单理解
fourierr的博客
07-17
1277
1、GORM是一种对象关系映射ORM框架,数据表对应结构体,数据行对应结构体实例,数据库字段对应结构体字段。
在gorm中,表名默认就是结构体名称的复数,也可以通过方法或者db.Table("表名")自定义表名;
列名由两个单词组成,在数据库中默认转小写后用下划线链接;
如果结构体有ID字段则默认ID字段为主键。
2、另外,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedA...
Gorm新手入门教程
qq_39298872的博客
09-12
1445
Gorm新手入门教程
官网:gorm中文官网
教程所在github地址:
一、 环境配置
安装
go get -u gorm.io/gorm
# mysql驱动 本文以mysql驱动为例
go get -u gorm.io/driver/mysql
# sqlite 驱动
go get -u gorm.io/driver/sqlite
二 、mysql数据库连接
dsn := "用户名:密码@tcp(ip:port)/dbName?charset=utf8mb4&parseTime=True&
Gorm简介
qq_41891425的博客
12-26
554
简介
gorm主要是把struct类型和数据库表记录进行映射,操作数据库的时候不需要直接手写SQL代码
导入依赖包:github.com/jinzhu/gorm
数据库定义的users表s
字段
属性
id
自增id
username
账号
password
密码
createtime
创建时间
Gorm的定义
对应关系
数据库中的username
结构体中 Username
password
Password
createtime
CreateTim
gorm 事务的使用
清风
05-16
4629
gorm事务的使用普通事务嵌套事务手动事务一个特殊的示例SavePoint、RollbackTo
gorm事务默认是开启的。为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。
如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。
一般不推荐禁用
// 全局禁用
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true,
})
go语言gorm基本使用
yoyogu的博客
10-27
9475
文章目录一、使用形式二、查询操作1、模型2、简单查询3、Select查询4、where查询(简单sql)5、where查询(struct&map)6、not条件查询7、带内联条件的查询8、Or条件查询9、链式查询10、扩展查询选项11、Order语句12、Limit语句13、Offset语句14、Count语句15、Group & Having16、Join语句17、Pluck语句18、Scan语句19、 Scopes语句20、指定表名21、预加载22、自定义预加载SQL23、嵌套预加载三、
GORM概述
清风
05-12
303
GORM概述前言概述快速入门
前言
官网文档另人看的头疼,还是记录一些常用用法吧。GORM给我最直观的感受:程序员只需关系结构体,操作结构体,无需关注如何操作数据库。
概述
数据表 <===> 结构体
数据行 <===> 结构体实例
字段 <===> 结构体字段
快速入门
db.AutoMigrate(&UserInfo{}):意思是自动迁移,自动迁移为给定模型运行自动迁移,只会添加缺少的字段,不会删除/更改当前数据。就是说如果结构体加了新的字段,会给表
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:数字20
设计师:CSDN官方博客
返回首页
Ast2risK
CSDN认证博客专家
CSDN认证企业博客
码龄1年
暂无认证
18
原创
1万+
周排名
6万+
总排名
1万+
访问
等级
193
积分
306
粉丝
获赞
评论
20
收藏
私信
关注
热门文章
GORM 快速入门最佳实践(含有样例数据库)
3381
使用 Docker 容器部署 MongoDB 并支持远程访问(超多坑)
851
使用 WSL 环境在 Goland 中开发 Go 项目
828
使用 Go 语言实现单词翻译功能 | simpledict 命令行词典
614
Go 语言实现 GitHub 第三方登录(基于 Gin 框架实现)
456
分类专栏
Golang
16篇
DevOps
3篇
最新评论
GORM 快速入门最佳实践(含有样例数据库)
3700x:
作为初学者,建议不要看这个文档,写的不明不白
使用 Go 语言实现单词翻译功能 | simpledict 命令行词典
owensweat:
好的 给你点赞咯 欢迎回访
使用 Go 语言实现单词翻译功能 | simpledict 命令行词典
Ast2risK:
火山
使用 Go 语言实现单词翻译功能 | simpledict 命令行词典
owensweat:
作业你用的啥翻译api呀
使用 Go 语言实现单词翻译功能 | simpledict 命令行词典
Ast2risK:
suki
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
负载均衡拓展从 0 到 1 —— Hertz 负载均衡实现
再也不用花时间在找封面上了!—— 基于 Go 实现的文章封面生成器
原来防御 CSRF 攻击这么简单? —— Hertz CSRF 中间件实战
2022年18篇
目录
目录
分类专栏
Golang
16篇
DevOps
3篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
Ast2risK
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值