【golang】DatabaseSQL与GORM实践 | 青训营笔记

234 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

database/SQL:

使用driver+DSN可以初始化DB连接————在go语言中可以连接mysql,建立连接并使用mysql

GORM是可以更简洁的实现数据库功能的,实现应用程序与databaseSQL之间的连接的一个包,提供了更加易于理解的操作接口。相当于一款插件,不需要再编写复杂的SQL语句,而是可以直接通过这款插件用更接近普通Go语句的方式实现SQL的功能。

要用gorm的话,

import (
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)

这是V2版本的,可以批量创建数据

gin是web框架

go语言笔记项目实战需要:安装 Docker/Postman/Git,安装WSL2

Docke是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像然后发布到任何流行的Linux操作系统的机器上,也可以实现虚拟化容器是完全使用沙箱机制,相互之间不会有任何接口

Postman 是一个很强大的 API调试、Http请求的工具,检验http的请求是否正常 Postman 安装及使用入门教程 - Mafly - 博客园 (cnblogs.com)

git是一个版本管理工具,是可以在你电脑不联网的情况下,只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,以后虽然修改了,但是通过git这个工具,可以把你原来提交的内容重现出来,这样对于你后来才意识到的一些错误的更改,可以进行还原。 (把代码从github上下载下来)

关于github,这是一个网站,就是每个程序员自己写的程序,可以在github上建立一个网上的仓库,你每次提交的时候可以把代码提交到网上,这样你的每次提交,别人也都可以看到你的代码,同时别人也可以帮你修改你的代码,这种开源的方式非常方便程序员之间的交流和学习。

git与github区别与简介_skyxmstar的博客-CSDN博客_git和github的区别【包括git的安装和使用】

Kitex是一个RPC框架,默认支持thrift和proto3两种IDL,对应的Kitex支持thrift和protobuf两种序列化协议。

RPC框架:

  • RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务
  • 本地过程调用:如果需要将本地student对象的age+1,可以实现一个addAge()方法,将student对象传入,对年龄进行更新之后返回即可,本地方法调用的函数体通过函数指针来指定。
  • 远程过程调用:上述操作的过程中,如果addAge()这个方法在服务端,执行函数的函数体在远程机器上,如何告诉机器需要调用这个方法呢?
  1. 首先客户端需要告诉服务器,需要调用的函数,这里函数和进程ID存在一个映射,客户端远程调用时,需要查一下函数,找到对应的ID,然后执行函数的代码。
  2. 客户端需要把本地参数传给远程函数,本地调用的过程中,直接压栈即可,但是在远程调用过程中不再同一个内存里,无法直接传递函数的参数,因此需要客户端把参数转换成字节流,传给服务端,然后服务端将字节流转换成自身能读取的格式,是一个序列化和反序列化的过程。 3.数据准备好了之后,如何进行传输?网络传输层需要把调用的ID和序列化后的参数传给服务端,然后把计算好的结果序列化传给客户端,因此TCP层即可完成上述过程,gRPC中采用的是HTTP2协议。
// Client端 
//    Student student = Call(ServerAddr, addAge, student)
1. 将这个调用映射为Call ID。
2. 将Call ID,student(params)序列化,以二进制形式打包
3. 把2中得到的数据包发送给ServerAddr,这需要使用网络传输层
4. 等待服务器返回结果
5. 如果服务器调用成功,那么就将结果反序列化,并赋给student,年龄更新

// Server端
1. 在本地维护一个Call ID到函数指针的映射call_id_map,可以用Map<String, Method> callIdMap
2. 等待客户端请求
3. 得到一个请求后,将其数据包反序列化,得到Call ID
4. 通过在callIdMap中查找,得到相应的函数指针
5. 将student(params)反序列化后,在本地调用addAge()函数,得到结果
6. 将student结果序列化后通过网络返回给Client

为什么使用IDL?因为如果我们使用RPC,就需要知道对方的接口是什么,需要传什么参数,也需要知道返回值是什么样的,用IDL来约定双方的协议。

WSL2