封面是用自己搭建的ai
绘图软件绘制的,以后再也不用去找图了,嘿嘿。
go的基础学习鸽了很久,因为vue源码分析是需要持续性的,不然就给忘了前面分析的啥了。目前那块告一段落了,但是又遇到了ai的降维打击带来的焦虑和无力,导致好几天无所事事,也不知道做什么。。
现在虽然也是无力和焦虑,但是总比等死好。
之前我们知道了如何创建一个module和本地引用它
坏蛋Dan:go基础学习--day3: Create a Go Module
今天我们来学习下如何接入数据库
可以看这篇Accessing relational databases - The Go Programming Language (google.cn)
首先,这个是一个包,它的作用如下:
简单地说就是给sql
(sql-like
)数据库提供泛型接口。
我们接下来会创建一个数据库,然后写代码去访问这个数据库。
这个过程中会使用到这个包。
既然要创建数据库,那么就得有数据库管理系统(database management system (DBMS))
。
那么选择哪款呢?官方推荐的MySQL
[2] ,相信大家也都不陌生,这里就不矫情去自己找个别的数据库管理系统了。
咱这里直接选MySQL 8.0
[3]版本的,它需要的window
开发者工具是Microsoft Visual C++2019
[4] ,相信大家应该都安装过了,毕竟前面rustup
也需要它。
但是我突然发现我安装的是2022的。。。。。
跟着一路往下安装即可。
不过既然追求刺激,那干脆直接放到云服务器上去算了。
至于啥是Docker
[5],简单地说就像是一个沙箱,提供一个独立的环境,类似虚拟机。我个人也是在入门学习阶段,所以这里就不多说了。
Docker
上有MySQL
的镜像:mysql - Official Image | Docker Hub
咱直接下载安装即可
那么镜像就下载完了,可以docker images
来查看本地是否已经有这个镜像了
不过在这之前,我们先到/usr/local
里面创建一个mysql
的文件夹,它是用来挂载的,这样mysql
的数据就会持久化了,即使是docker
重启了也没问题。
然后我们来创建容器
--name
表示容器的名字-p
则是linux
映射端口-v
:docker
容器文件挂载目标,语法是 -v ${目标文件路径}:${容器文件路径}
这一步就是数据持久化的关键-e
:配置-d
:后台运行mysql
:镜像创建完毕之后可以通过docker ps -a
来看下我们的容器
现在已经安装完毕了,然后我们来连接下试试,不过在这之前,我们还需要进入容器中才行。
接着就可以连接mysql
了
然后我们还需要配置下相关的权限,这样我们远程连接的时候就不会有权限报错的问题。
注意:别忘了关闭防火墙或者在防火墙里面新增3306
这个端口的白名单,不然外网访问会被拒绝。
然后本机随便随便用个工具连接试下,我用的HeidiSQL
[6],正常连上。
HeidiSQL
虽然没有流行的Navicat
[7]那么多功能,但是它小巧,免费,一般使用足够了。
不过仅支持window
,所以如果你是其它平台用户,那么还是推荐你用Navicat
,或者MySQL
自带的Workbench
当然,如果不想安装软件,咱直接vscode
插件走起:ppz-pro/ppz.vscode: GUI for RDBMS(Relational Database Management System) (github.com)
一老哥的vscode
插件,支持多种关系型数据库。
扯得有些远了,那么基本准备完毕,我们开始学习今天的内容。
我们来搞个demo
,用来存储vintage jazz records
也就是古典爵士记录。
我们的内容可以分割为以下几个部分:
driver
Query
也就是查Add
即新增数据随便起个文件夹,然后cd
到里面去init
。
我这里就直接用工具创建了
当然,数据插入还是用的命令行,因为一个一个新增非常麻烦。
如果是终端用户,按以下操作
这些相信大家都看得懂,就是先创建数据库,然后如果存在对应的album
的表,先删除,然后再创建album
表,它有四个字段id、title、artist、price
,其中id
为主键,自增。price
的类型是DECIMAL
,这个是为了保护精度,毕竟价格这东西很敏感。
然后我们往表里插入四行数据。
最后搜索所有内容展示出来。
那么建库建表和插入数据就完成了
Driver
然后我们准备开始将数据库接入到我们的go
代码里。
这里我们就需要使用到前面提到的database/sql
。
不过在这之前,我们还需要一个类似中间件的工具来转换我们的代码变成数据库认识的指令,我们一般管这叫做Driver
也就是驱动器。
我们用的是MySQL
,所以我们用这个: go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package (github.com)
如果你用的别的数据库,或者你想换一个其它驱动器,你可以在这里面找:SQLDrivers · golang/go Wiki (github.com)
然后回到我们的项目中,我们新建main.go
文件
然后终端运行go get .
将它引入。
现在我们可以开始连接数据库了
简单的说下这里面代码做了什么:
*sql.DB
的变量db
,它就是我们的数据处理器,后面我们的指令都是通过它来执行的。不过需要注意,这里我们把db
放到全局了,这是为了方便,但是尽量避免这么做,道理大家都懂,或者命名奇形怪状一点即可。driver
创建一份config
,FormatDSN
就是将config
装换成可以被数据库认识的strings
。sql.open
建立连接并且初始化db
变量err
,如果有则中断程序并且打印错误(不够优雅,以后会遇到优雅的方案)db.Ping
:这个是用来确认是否成功和数据库建立联系。在runtime
阶段,有些driver
会存在延迟,无法立即建立联系,那么这个时候就需要轮询处理,确认是否成功建立了联系。ping
失败,直接中断,成功则打印Connected
。不过在我们运行代码之前,我们需要设置两个操作系统环境变量,就是前面的DBUSER
和DBPASS
对于window
用户
我们只能说这里还有一个powerShell
需要伺候
现在我们可以运行代码了
果不其然有问题
这个问题是因为MySQL8.0
是使用caching_sha2_password
来加密用户密码的,我们可以把它改为低版本的caching_sha2_password
加密方案。
进入到我们之前挂载的文件夹/usr/local/docker/mysql/conf.d
里面创建一个my.cnf
作为mysql
的配置文件。
然后新增如下内容
这里最重要的其实是default_authentication_plugin=mysql_native_password
这一行,将默认的加密方式改为mysql_native_password
。
然后重启docker
里的mysql
重启完之后再回到我们本机项目中运行go run .
然后你就会遇到另一个问题
这个是因为driver
默认没有开启这个plugin
,我们需要将对应的字段AllowNativePasswords
指为true
然后再重新运行下go run .
这样就连接成功了。
在开始查之前,我们先来定义下行的类型
然后我们来写查询的逻辑
简单的说下这里面做了什么:
db.Query
方法传入了一个SQL
字符串语句。选择所有artist
为传入的name
的数据。albums
里。rows.Scan
方法用于将数据里对应的字段的值赋值给传入的指针指向的数据。&
这个大家应该都不陌生,就是引用的意思,在这里可以直接看做指针。当行数据赋值给alb
变量之后,再将它append
到albums
这个slice
即切片里。nil
和数据。经典:if err != nil return nil, err
。。。然后我们来用下这个函数,回到main
函数中。
当然,这里是非常非常基础的使用,实际上你应该要把SQL
语句以动态的方式传入。
直接上代码
这个就没啥好说的了,不过这里用的是db.Exec
而不是Query
的,需要注意。
调用LastInsertId
方法获取最后一条数据的id
并返回。
我们在main
函数中引用下
额,我这之前调整过数据,所以id
没有连续
大部分时间都是在配置环境和排错。。
代码还是挺好理解的,虽然分析的很少。
另外相信大家也都看到了各处的err
处理场景。。怎么说呢,一言难尽。。
大时代的变化,不去拥抱变化,最终只会被淘汰,这就是我这段时间一直在焦虑痛苦的地方,但是无力啊。。。
ai
这趟列车是处于到来前的轰隆声,还是已经在经过准备把我远远甩去了呢?
编辑于 2023-04-08 22:50・IP 属地广东