Gin入门(4)-golang如何连接mysql和redis
数据库、Redis和GO
接着上期的内容
这是func InitConfig()
最后两行代码
initDB()
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
都是接口,先看定义
// Option gorm option interface
type Option interface {
Apply(*Config) error
AfterInitialize(*DB) error
}
// Dialector GORM database dialector
type Dialector interface {
Name() string
Initialize(*DB) error
Migrator(db *DB) Migrator
DataTypeOf(*schema.Field) string
DefaultValueOf(*schema.Field) clause.Expression
BindVarTo(writer clause.Writer, stmt *Statement, v interface{})
QuoteTo(clause.Writer, string)
Explain(sql string, vars ...interface{}) string
}
很明显从定义来理解某个接口是相当困难的,我们从项目是如何传参入手反而轻松一些
所以我们需要认真琢磨mysql.Open(dsn)
和&gorm.Config{}
接着看mysql.Open(dsn)
的实现很容易陷入套娃,我们学编程的时候千万不要硬向底层跑,你不把别人给我们封装好的浅显易懂的东西理解,怎么可能举一反三快速理解底层呢?
库的实现都是大佬日思夜想写出来的,先不说能不能理解,想要一行行看完,你都得花上不少时间
所以怎么办呢?请大模型啊
所以这里mysql.Open(dsn)
方法通过dsn
(地址)成功连接(挖路)到了数据库,返回对应的&Dialector{}
(路)给gorm.Open()
&gorm.Config{}
反而好理解得多,这里我们就不深入它的实现了,只需要知道我们传给gorm.Open()
的是刚初始化好的interface就好了
哎呀不对,所以gorm.Open()
到底是在干嘛?
所以我们在前面的比喻中应该加上:Web服务器(采购/销售)、数据库(仓库),Gorm所实现的就是(运输车队)的事情,当然这个比喻只能帮我们粗浅的理解而已,这些概念的本身并不是一两个词就可以概括的
if err != nil {
log.Fatalf("Fail to initialize database, got error: %v", err)
}
没啥说的 依旧面向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()
其实也就只讲完了一行
任重道远啊
如果觉得我的文章写的不错麻烦各位点个赞,你们的支持是我创作的动力
各位下次再见