Gin入门(4)-golang如何毗连mysql和redis

打印 上一主题 下一主题

主题 1943|帖子 1943|积分 5829

数据库、Redis和GO

接着上期的内容
这是func InitConfig()最后两行代码
  1. initDB()
  2. initRedis()
复制代码
这两行代码恰好对应./config/下的db.go和redis.go
我们就分两部门讲
!!!请留意,本期默认大伙理解mysql和Redis,不作赘述
Gorm-通过编程完成对数据库的管理

我们先点进initDB()

会发现db.go里就只放着initDB()
通过上期的内容,我们立马能明白dsn := AppConfig.Database.Dsn
这里创建了一个string dsn变量,并将./config/config.yaml里填入的Dsn的值赋值于它
但dsn到底是什么?
省流的话你只要认为他是数据库的快递地址就行了,有了地址接下来就是运输要怎么认路的事了
啥是DSN?
DSN(Data Source Name)是用于在数据库毗连中标识和定位数据库的字符串。它通常包罗数据库的类型、主机名、端标语、数据库名称和其他毗连参数。DSN 提供了一种同一的格式,用于指定命据库毗连的具体信息,以便应用步伐能够毗连到正确的数据库。
1. 底层原理如下:
2. 格式和协议:DSN 的格式因不同的数据库和驱动步伐而异,但通常遵循一种特定的协议和语法。例如,对于 MySQL 数据库,DSN 可能是以 "mysql:" 开头,后跟主机名、端标语、数据库名称等信息。
3. 驱动步伐:应用步伐使用 DSN 来指定要毗连的数据库,并将其传递给特定命据库的驱动步伐。驱动步伐根据 DSN 中的信息来确定要毗连的数据库的位置和其他毗连参数。
4. 毗连字符串解析:数据库驱动步伐解析 DSN 字符串以提取毗连参数。这些参数可以包罗主机名、端标语、用户名、暗码、数据库名称等。驱动步伐使用这些参数来建立与数据库的毗连。
5. 毗连建立:根据解析后的毗连参数,驱动步伐使用底层协议(如 TCP/IP)与数据库进行通信。它将毗连请求发送到指定的主机和端口,并进行身份验证和授权过程以建立毗连。
6. 毗连状态:一旦成功建立毗连,驱动步伐将返回一个表示数据库毗连的对象(如 PDO 对象)。这个毗连对象可以用来执行数据库操作,如执行查询、插入数据、更新数据等。
总的来说,DSN 提供了一种标准的格式,用于指定命据库毗连的具体信息。通过解析和使用 DSN,数据库驱动步伐能够获取正确的毗连参数,并与数据库建立通信。这种标准化的毗连方式使得应用步伐可以轻松地切换和毗连不同的数据库,提供了更大的灵活性和可移植性。
————————————————
原文链接:https://blog.csdn.net/qq_36777143/article/details/131174267
来到本文件重点:db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

这里用到了Gorm库(官中)

ORM Library?什么是ORM
百科写得又臭又长,这里借用阮一峰前辈的总结
简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。
照旧二话不说看文档

对比一下

func gorm.Open()

Dialector和Option都是接口,先看定义
  1. // Option gorm option interface
  2. type Option interface {
  3.         Apply(*Config) error
  4.         AfterInitialize(*DB) error
  5. }
  6. // Dialector GORM database dialector
  7. type Dialector interface {
  8.         Name() string
  9.         Initialize(*DB) error
  10.         Migrator(db *DB) Migrator
  11.         DataTypeOf(*schema.Field) string
  12.         DefaultValueOf(*schema.Field) clause.Expression
  13.         BindVarTo(writer clause.Writer, stmt *Statement, v interface{})
  14.         QuoteTo(clause.Writer, string)
  15.         Explain(sql string, vars ...interface{}) string
  16. }
复制代码
很明显从定义来理解某个接口是相称困难的,我们从项目是如何传参入手反而轻松一些
所以我们需要认真琢磨mysql.Open(dsn)和&gorm.Config{}

接着看mysql.Open(dsn)的实现很容易陷入套娃,我们学编程的时间万万不要硬向底层跑,你不把别人给我们封装好的浅近易懂的东西理解,怎么可能闻一知十快速理解底层呢?
库的实现都是大佬日思夜想写出来的,先不说能不能理解,想要一行行看完,你都得花上不少时间
所以怎么办呢?请大模子啊

所以这里mysql.Open(dsn)方法通过dsn(地址)成功毗连(挖路)到了数据库,返回对应的&Dialector{}(路)给gorm.Open()
&gorm.Config{}反而好理解得多,这里我们就不深入它的实现了,只需要知道我们传给gorm.Open()的是刚初始化好的interface就好了
哎呀不对,所以gorm.Open()到底是在干嘛?

所以我们在前面的比喻中应该加上:Web服务器(采购/贩卖)、数据库(仓库),Gorm所实现的就是(运输车队)的事情,当然这个比喻只能帮我们粗浅的理解而已,这些概念的本身并不是一两个词就可以概括的
  1. if err != nil {
  2.         log.Fatalf("Fail to initialize database, got error: %v", err)
  3. }
复制代码
没啥说的 依旧面向if err != nil编程/.
接着看


(可以看到方法的阐明,不过不够具体)
文档没有写清楚的东西,我们就问ai呗


是不是很容易理解
同时我们也明白了config中的MaxIdleConns和MaxOpenConns
回到工程
initDB()最后一句是global.Db = db

其定义在/global/global.go,从其和global.RedisDB右边的用法量就可以知道其作为全局变量的重要性了
Redis in golang


这一眼看过去比initDB()好理解太多了
你甚至能通过代码字面上看出它都做了什么:
创建一个名为RedisClient的毗连,指向本机的6379端口(Redis所运行的端口),暗码为空,选择第0个Redis数据库
通过redis.Ping()方法毗连测试,对效果进行错误处理
没有问题就把这个毗连复制给全局变量global.RedisDB以便在其他步伐中进行调用
结语

本篇我们讲完了./config/下全部的文件,也算是突破性进展了
但是!
我们的func main()其实也就只讲完了一行
任重道远啊
如果觉得我的文章写的不错贫苦各位点个赞,你们的支持是我创作的动力
各位下次再见

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表