老师的课程很专业也让我收获了很多,但是自己数据库的相关知识只停留在学校课程,很难完全理解课程的细节内容。因此整理笔记希望能理解database/sql与GORM【是什么、怎么做的、怎么用】的问题,希望能更加深刻地理解这些工具产生的原因,是用于解决什么问题的。
篇幅有限就不具体解释数据库:关系、表、记录、字段等概念,具体可以查询菜鸟教程。
什么是database/sql 什么是GROM
database/sql 是Go语言标准库提供的用于进行数据库操作的库。
它是一个对关系型数据库的通用抽象,提供了标准的、轻量的、面向行的接口,使得Go可以通过统一的接口来访问不同的数据库。
GORM 是Go语言中一个对开发者友好的ORM框架,有着完善的中文文档。
那么就会考虑 ORM 是什么? ORM(Object Relational Mapping)中文是对象关系映射,这里虽然每个字都认识但无法理解,因为其实应该明确一下断句,是“对象和关系的映射”既Object-Relational Mapping。
这里我们补充一些知识再来回看这一段话可能会更好理解。
面向对象编程和关系型数据库的结合是当下最常用的技术栈。但他们的模型不同,面向对象是把实体看成 对象(object) ,关系型数据库则是采用实体间的 关系(relation) 连接数据。那么如果我们把关系也用对象来编程,就可以用面向对象的编程语言来统一操作关系型数据库了。
这样我们再来回看ORM的定义,同时观察ORM如下的操作,可能会更好理解为什么需要ORM。
·数据库的表(table) --> 类(class)
·记录(record,行数据) --> 对象(object)
·字段(field)--> 对象的属性(attribute)
在ORM出现之前当编写的程序需要访问数据库时,就可能需要采用硬编码的方式,为每一种可能的数据库访问操作单独提供方法。硬编码可以理解为我们需要把所有命令都通过字符串或是数字的方式写死在代码里,这样显然是增加代码的维护难度的。
以下为SQL硬编码的数据库查询操作:
String sql = "SELECT ... FROM persons WHERE id = 10";
DbCommand cmd = new DbCommand(connection, sql);
Result res = cmd.Execute();
String name = res[0]["FIRST_NAME"];
以下是使用了ORM映射的C#实现伪代码:
Person p = repository.GetPerson(10);
String name = p.getFirstName();
ORM的优点:
1、数据模型都在一个地方定义便于维护
2、可以帮助自动完成很多功能如数据消毒、预处理、事务等等
3、代码会更加清晰容易理解
ORM的缺点:
1、ORM不是轻量工具,需要花精力去学习和设置
2、会与复杂的查询ORM可能无法表达
3、ORM抽象掉了数据库层,开发者无法了解底层的操作,无法定制特殊的SQL
如何使用database/sql和GROM
由于还没有具体使用过GROM,具体的心得将在下一篇笔记中描述,目前打算跟着B站视频《GO+Gin+GROM+MySql|实现最基础的CRUD链接数据库》操作一下,练习一下近几节课学到的知识点。
基础薄弱,如有错误还望同学们批评指点。
以下是我参考的文章:
GORM与database/sql入门学习 | 青训营笔记
什么是ORM?为什么用ORM?浅析ORM的使用及利弊_不使用orm的好处
ORM 实例教程 - 阮一峰的网络日志