设计模式之 DatabaseSQL 与 GORM 实践 | 青训营笔记

199 阅读3分钟

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

理解database/sql

基本用法-Quic Start

image.png

上例主要包含了建立数据库连接、根据建立的连接进行查询,将查询到的数据Scan到我们的对象中,同时处理一些错误。简单地展示了如何快速使用sql包。

设计原理

根据database/sql包的设计思想,go语言对数据的操作可以分为三层:

第一层是应用程序层,即我们编写的go程序;第二层就是database/sql层,用于包装对数据库的各种操作;第三层为数据库层,包含各类sql类型的数据库。各层之间还有一些诸如上层应用、数据库Driver、连接池等实现,示意图如下:

image.png

GORM基础使用

背景知识

gorm是go语言中常用的一个设计简洁、功能强大、自由扩展的全功能ORM,也即Object-Relationl Mapping(对象关系映射),这里的Relationl指的是关系型数据库它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。

基本用法

image.png

首先对比database/sql包与gorm在完成同样一个查询语句时的代码区别。 可以发现相比于database/sql包,gorm进行了很多的优化, 比如不用手动调用数据库的驱动、大量合并代码,内部处理查询错误等,优势十分明显。同时gorm的CRUD操作也十分简单,浅显易懂:

image.png

image.png

模型定义(约定泛式)

使用gorm操作数据库时,我们可以用model,也就是go中常用的结构体,完成对数据库表的映射。数据库的表对应结构体,数据行对应结构体实例,数据库字段对应结构体字段。 在gorm中,表名默认就是结构体名称的复数,也可以通过方法或者db.Table("表名")自定义表名; 列名由两个单词组成,在数据库中默认转小写后用下划线链接; 如果结构体有ID字段则默认ID字段为主键。

image.png

关联介绍(实战场景)

我们先假设有如下一个场景:

User拥有一个Account(has one),拥有多个Pets(has many),多个Toys(多态has many),属于某Company(belongs to)属于某Manager(单表belongs to)管理Team(单表has many)会多种Languages(many to many)拥有很多Friends(单表 many to many)并且他的Pets也拥有一个玩具Toy(多态has one)

image.png

在这种场景下,我们应该如何使用gorm进行数据库的操作呢?这里简单展示几个gorm场景应用代码块:

关联操作的CRUD:

image.png

关联操作-Preload/Joins预加载:

image.png

关联操作-级联删除

image.png

本节介绍了gorm是一个怎样的orm,介绍了一些gorm在使用上的知识,描述了一些常用的场景及用法,介绍了一些gorm的模型定义、关联约定等基础概念以及软件的设计泛式。磨刀不误砍柴工,祝大家在gorm的使用路上越走越轻松。