Gorm系列之1

2023-11-02

Gorm系列之1

特别指出

特别指出的是,该系列基础代码来自git上的开源项目7days-golang,项目地址:https://github.com/geektutu/7days-golang。

原项目作者:极客兔兔,个人主页:https://geektutu.com/。

除基础代码外,部分解释内容也摘自作者的系列博文,地址:https://geektutu.com/post/gee.html

大神极客兔兔在他的博客中对该项目有自底向上的详细讲解,并将每个项目分成7天来学习,希望深入分析源码的朋友可以移步上面的传送门。相比原作者,我将更多的自顶向下入手,先从整体分析项目结构,再深入其中一些关键的部分,适用于希望快速了解项目结构的人和初学者;同时在原项目基础上做了一定的增添。

项目传送门

https://github.com/CAGeng/Gorm

建议clone后再继续阅读。好!

3~

2~

1~

Gorm,启程!

介绍

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。Gorm是这样用Go语言写成的ORM框架,可以支持多种数据库。

配置环境

作为起笔的第一个系列,这里花一些篇幅简单介绍环境配置和项目导入的问题,有问题在本贴下方留言看见会速回。

git clone到本地

Ide

我使用的是Goland

go.mod配置

我使用了go新推出的go.mod的包管理方式来取代GoPath,可以解决项目目录带来的大部分困扰,保证能“跑起来”。

1

需要将file->settings中的这里勾上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SP8UZhNP-1619025978170)(Gorm1.assets/image-20210421235751087.png)]

2

git中的项目本身已经配置好了go.mod,如果有导入问题,可以将其删掉,重新执行下面的步骤(不是必要的)

打开terminal,在项目根目录下输入:

go mod init Gorm

需要使用自己喜欢的项目名字,修改最后一个参数就好啦。

3

之后在项目中类似下面这样就可以导入自己的包

import (
	"Gorm/clause"
	"Gorm/log"
)

4

对于不是本项目中包导入的问题,鼠标放上去根据提示一般都能导入。不行的话可能是源的问题,要配置一下代理,就不写了。

安装sqlite3数据库

Gorm的目标是支持多个数据库,在开发过程中使用的demo是sqlite3,安装过程不赘述,极客兔兔的博文中也有:https://geektutu.com/post/geeorm-day1.html

输出器

现在可以开始动手了,先写一个Tprinter类,支持缩进输出,方便之后调试时使用。代码位置:/log/TPrinter.go

为了方便输出具有层级结构(这样更容易看清楚执行逻辑),Tprinter实现了两个函数用来提高和降低输出层级(缩进),同时维护一个全局的Tprinter实例,使用起来是这样:

log.Mytprinter.IndentLvUp()
defer log.Mytprinter.IndentLvDown()
log.Mytprinter.Print("testRecordInit begin")

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MceDts78-1619025978172)(Gorm1.assets/image-20210422002154893.png)]

log

原项目中还实现了log.go,是兔兔封装的一些输出函数,使用可以参考原博客。

Gorm初探

ORM框架是用来做什么的前面已有简单介绍,现在具体来看看Gorm是怎么用到。**Talking is cheap.Show me the code.**废话不多说,直接看代码:位置: /session/record_test.go

//    ./session/record_test.go
var (
	user1 = &User{"Tom", 18}
	user2 = &User{"Sam", 25}
	user3 = &User{"Jack", 25}
)
func testRecordInit(t *testing.T) *Session {
	...
    //确定表格式
	s := NewSession().Model(&User{})
    
    //删表建表
	err1 := s.DropTable()
	err2 := s.CreateTable()
    
    //插入数据
	_, err3 := s.Insert(user1, user2)
	if err1 != nil || err2 != nil || err3 != nil {
		t.Fatal("failed init test records")
	}
	return s
}

简言之,利用ORM,操作数据库不需要手动使用“SELECT”等语句,同时开发语言(go)与数据库语言(mysql、sqlite等)的对象类型的转换也是自动的。

然后来看一下这个test的执行逻辑,我插入了一些Tprinter,先输出一些相对顶层的逻辑(带颜色的log输出的先不要在意)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O3r9uPXP-1619025978173)(Gorm1.assets/image-20210422010250157.png)]

认识 session

看来testRecordInit进行的创建和insert操作,是由session这个目录负责执行,事实确实如此:

  • table.go负责表相关操作
  • record.go负责条目相关的操作
  • raw.go是上面两个的基础,封装一些基础的操作

所以,session主要的工作是维护打开的数据库对象,并封装数据库操作,当然这只是顶层模块,不可能负责实现所有的底层逻辑,后面还会逐步深入。看一下session类的定义:

//  /session/raw.go
type Session struct {
	db      *sql.DB
	dialect dialect.Dialect
	refTable *schema.Schema
	clause clause.Clause
	sql     strings.Builder
	sqlVars []interface{}
}

里面用到的底层类后面也会一一展开介绍。

这一节先到这里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gorm系列之1 的相关文章

  • sql临时表、创建虚拟表、select临时表、多行数据、自定义数据、插入数据

    SELECT FROM VALUES John 25 Jane 30 Mike 35 AS table name name age 方法2 select 1 2 union all select 3 4
  • 如何在CentOS安装SQL Server数据库并通过内网穿透工具实现公网访问

    文章目录 前言 1 安装sql server 2 局域网测试连接 3 安装cpolar内网穿透 4 将sqlserver映射到公网 5 公网远程连接 6 固定连接公网地址 7 使用固定公网地址连接 前言 简单几步实现在Linux cento
  • Nexus5596交换机支持3层需要的子卡

    3层子卡 nexus5596如果没有这块子卡 无法支持3层特性 TEST Cisco N5596 1 show modu Mod Ports Module Type Model Status 1 48 O2 32X10GBase T 16X
  • 外包干了2个月,技术退步明显...

    先说一下自己的情况 大专生 18年通过校招进入武汉某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • 软件开发和网络安全哪个更好找工作?

    为什么今年应届毕业生找工作这么难 有时间去看看张雪峰今年为什么这么火就明白了 这么多年人才供给和需求错配的问题 在经济下行的今年 集中爆发 供给端 大学生越来越多 需求端 低端工作大家不愿去 高端岗位又太少 很多基础行业 比如机械 土木 所
  • 拼多多详情API开启运营比价新纪元

    随着互联网的快速发展 电商行业正在迅速崛起 拼多多作为一家新兴的电商平台 凭借其独特的营销策略和创新的商业模式 成为了电商行业的一匹黑马 在拼多多的成功背后 其详情API接口营销起到了至关重要的作用 本文将详细介绍拼多多详情API接口营销的
  • 亚信安慧AntDB引领数字化转型:浙江移动成功实现CRM系统全域改造

    数字时代 通信运营商在不断迭代的背景下 需要不断探索数字化转型的路径 以适应快速发展的市场和技术环境 在这一浪潮中 浙江移动站在前沿 率先完成了其CRM系统的全域改造 采用了亚信安慧公司研发的AntDB数据库 为整个行业树立了数字化转型的标
  • 【计算机毕业设计】线上招聘问答系统

    计算机网络发展到现在已经好几十年了 在理论上面已经有了很丰富的基础 并且在现实生活中也到处都在使用 可以说 经过几十年的发展 互联网技术已经把地域信息的隔阂给消除了 让整个世界都可以即时通话和联系 极大的方便了人们的生活 所以说 线上招聘问
  • C 语言文件读取全指南:打开、读取、逐行输出

    C 语言中的文件读取 要从文件读取 可以使用 r 模式 FILE fptr 以读取模式打开文件 fptr fopen filename txt r 这将使 filename txt 打开以进行读取 在 C 中读取文件需要一点工作 坚持住 我
  • 【计算机毕业设计】Java图书馆智能选座系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本图书馆智能选座系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • 基于java的学生宿舍管理系统设计与实现

    基于java的学生宿舍管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生宿舍管理系统设计与实现的研究背景和动机 在数字化时代的推动下 学生宿舍管理系统已经成为了管理学生宿舍的重要工具 学生宿舍管理系统能够帮助管理者更好地管
  • Docker 安全必知:最佳实践、漏洞管理与监控策略

    容器安全是实施和管理像 Docker 这样的容器技术的关键方面 它包括一组实践 工具和技术 旨在保护容器化应用程序及其运行的基础架构 在本节中 我们将讨论一些关键的容器安全考虑因素 最佳实践和建议 容器隔离 隔离对于确保容器化环境的强大性和
  • 《Spring 测试指南》:JPA、MockMvc 和 @SpringBootTest 详解

    测试 Spring 提供了一组测试工具 可以轻松地测试 Spring 应用程序的各个组件 包括控制器 服务 存储库和其他组件 它具有丰富的测试注释 实用程序类和其他功能 以帮助进行单元测试 集成测试等 JPA 测试 Spring JPA J
  • 编程和数值计算平台:MATLAB R2023a(Win/Mac)激活版

    MATLAB R2023a是一款强大的数值计算和科学编程软件 广泛应用于工程 科学和数学领域 win版 https soft macxf com soft 3541 html id MzE5MTM 3D mac版 https www mac
  • Python 中多态性的示例和类的继承多态性

    单词 多态 意味着 多种形式 在编程中 它指的是具有相同名称的方法 函数 操作符 可以在许多不同的对象或类上执行 函数多态性 一个示例是 Python 中的 len 函数 它可以用于不同的对象 字符串 对于字符串 len 返回字符的数量 示
  • 【计算机毕业设计】二手家电管理平台

    时代在飞速进步 每个行业都在努力发展现在先进技术 通过这些先进的技术来提高自己的水平和优势 二手家电管理平台当然不能排除在外 二手家电管理平台是在实际应用和软件工程的开发原理之上 运用java语言以及前台VUE框架 后台SpringBoot
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • Oracle EBS AP发票导入 API Rejection List 第二部分

    Oracle EBS AP发票导入 API Rejection List 第二部分 The report lists the reason the invoice could not be imported and prints a bri
  • 数据库 | 面试官:一次到底插入多少条数据合适啊?.....面试连环炮

    数据库 面试官 一次到底插入多少条数据合适啊 面试连环炮 数据库插入操作的基础知识 插入数据是数据库操作中的基础 但是 我们程序员将面临随之而来的问题 如何快速有效地插入数据 并保持数据库 性能 当你向数据库中插入数据时 这些数据直接存储到

随机推荐

  • vue3 transition 隐藏过渡,折叠过渡效果实现

    隐藏过渡 可以直接使用官方给出的例子 隐藏过渡效果 fade enter active fade leave active transition opacity 0 5s ease fade enter from fade leave to
  • Python使用pyechart绘制3d散点图

    代码 import numpy as np import pyecharts options as opts from pyecharts charts import Scatter3D if name main a np arange 1
  • Python 之pandas库的安装及库安装两方法总结

    如果你连续看了博主的各类Python的库引用 你会发现这都是套路 先上正儿八经的流程 后面一句话总结一下这些库的安装套路 不知道安装库的你们用的什么操作 请耐心看到最后哦 保证未来的安装一举成功 一 pandas库的安装 1 打开cmd窗口
  • 扩展Ribbon支持Nacos权重的三种方式

    Nacos支持权重配置 这是个比较实用的功能 例如 性能差的机器权重设低 性能好的机器权重设高 让请求优先打到性能高的机器上去 某个实例出现异常时 把权重设低 排查问题 问题排查完再把权重恢复 想要下线某个实例时 可先将该实例的权重设为0
  • Vue - 将页面内容下载为 pdf 格式文件(html2canvas + jspdf)

    Vue 将页面内容下载为 pdf 格式文件 html2canvas jspdf 一 安装所需依赖 二 htmlToPdfNew js 核心文件 三 组件使用方法 四 组件使用实例 一 安装所需依赖 npm install html2canv
  • Apache Beam的特点

    不多说 直接上干货 Apache Beam 有两大特点 1 统一了数据批处理 batch 和流处理 stream 编程范式 2 能在任何执行引擎上运行 它不仅为模型设计 更为执行一系列数据导向的工作流提供了统一的模型 这些工作流包括数据处理
  • unity游戏开发入门——加载场景的方式

    unity加载场景的四种方式分别是 1 Application LoadLevel 同步载入 如果当前场景为A 我们要切换到场景B unity会在切换场景的时候将场景B中的全部内容 场景B中全部的静态物体 不包含兴许代码中Instantia
  • unity C# 使用 action实现函数回调和 委托(Delegate)

    一 C 使用 action实现函数回调 1 1 声明一个方法 这个方法需要传递进去一个函数 并且这个传递进去的函数也是需要参数的 我们把它声明为Action
  • unity 计时器

    unity 计数器 计时器就是在游戏界面的时间 可以是一个正计时 也可以是倒计时 现在简单分享一下简单的计时代码 private void Update totalTime Time deltaTime if totalTime lt 0
  • SpringCloud的搭建

    SpringCloud的搭建 源码 Eureka的创建步骤 最终版为2021 5 23版本 每次提交对应下面的一个步骤 1 Eureka保证AP 2 Eureka的使用 Ribbon的使用步骤 最终版为2021 5 24版本 每次提交对应下
  • Hive SQL中的lateral view explode

    公众号后台回复 图书 了解更多号主新书内容 作者 胖里 来源 胖里的日常 标题中直接写lateral view explode是我鲁莽了 毕竟这俩不是法定cp 也并不是不能分开各自生活 其中explode可以放在select从句中单独使用
  • android ScrollView 嵌套RecyclerView 解决滑动冲突

    为了解决滑动事件的冲突需要重写ScrollView Copyright 2014 Soichiro Kashima Licensed under the Apache License Version 2 0 the License you
  • 【Linux

    目录 一 判断文件是否存在 1 1 判断目录是否存在 1 2 判断文件是否存在 1 3 其他文件类型判断 二 字符串截取 去掉文件后缀 2 1 获取文件后缀 2 2 获取文件前缀 在Linux编程过程中 设计到对文件的处理时常常需要判断某个
  • 远程调试运行在Resin上面的Web应用程序

    为什么80 的码农都做不了架构师 gt gt gt 有时候 我们不得不放弃在本地调试我们的程序 把我们的程序先布署到服务器 然后把调试信息都记在日志中 用眼睛瞅日志来调试程序 不是用这种方式不行 只是效率太低 本来写程序是一件开心的事情 却
  • UE4数字孪生项目制作规范

    UE数字孪生项目制作规范 说明 协同 规范 说明 UnrealEngine项目 打包输出Window应用 鼠标操作 键盘快捷键操作 协同 内部开发的可以自己内网搭建svn服务器协同开发 如有外部人员参与项目开发 则项目协同可使用svnbuc
  • Spring Boot:jar中没有主清单属性

    D hu git spring xxx xxx target gt java jar spring cloud eureka 0 0 1 SNAPS HOT jar spring xxx xxx 0 0 1 SNAPSHOT jar中没有主
  • 数据库的背景知识及基本概念

    数据库的背景知识及基本概念 随着互联网技术的高速发展 大量的数据正在不断产生 伴随而来的是如何安全有效的存储 检索 管理他们 使用数据库可以高效且条理分明地存储数据 它使人们能够更加迅速和方便管理数据 主要体现一下几个方面 可以结构化存储大
  • 奥迪A6 C5空调制冷效果差维修

    一台2003年出厂的一汽奥迪A6 C5 2 8L轿车 装备BBG发动机及双区自动空调 行驶约159000公里 该车空调制冷效果差 空调面板设定22度 用手感知出风口温度 凉 但不够凉 压缩机离合器正常吸合 皮带盘正常运行 连接空调歧管压力表
  • 从零读懂CAN总线(上)

    概要 上世纪八十年代以来 汽车ECU越来越多 如ABS 电控门窗 电子燃油喷射装置 如果仍然采用常规的点对点布线方式 即电线一段与开关相接 另一端与用电设备相通 将会导致车上电线数目的急剧增加 从而带来线束的冗余及维修成本的提高 这就对汽车
  • Gorm系列之1

    Gorm系列之1 特别指出 特别指出的是 该系列基础代码来自git上的开源项目7days golang 项目地址 https github com geektutu 7days golang 原项目作者 极客兔兔 个人主页 https ge