这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。
Gorm
理解数据库
数据库的起源?
数据库的起源: 随着互联网时代的到来,需要持久化数据呈现井喷式发展,常规的 io操作虽然 可以满足持久化的需求, 但是,对于持久化的目的,对数据的操纵,显然力不从心, 且操作的复杂度很大,不利于大规模的发展,审时度势,数据库应运而生。
数据库是什么?
数据库,又称为数据管理系统,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的资料执行新增、截取、更新、删除等操作 所谓“数据库”是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。一个数据库由多个表空间(Tablespace)构成。
数据库的分类
根据存储模型可将数据库划分为关系型数据库和非关系型数据库。关系型数据库, 是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库 中的数据。 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是 由二维表及其之间的联系所组成的一个数据组织。标准数据查询语言SQL 就是一种 基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。
-
关系型数据库,常用的关系型数据库有
- MySQL,MySQL也是我现在使用最多的数据库
- Microsoft SQL Server
- Oracle
-
非关系型数据库,常用的非关系型数据库有:
- MongoDB
- Redis
数据库的基本用法?
- 导入要使用的数据库的driver
- 初始化DB连接
- 执行sql语句实现操作
数据库的设计原理
DB连接的几种方式:
- 直接连接/Conn
- 预编译/Stmt
- 事务/Tx
处理返回数据的几种方式?
- Exec/ExecContext-> Result
- Query/QueryContext -> Rows(Columns)
- QueryRow/QueryRowContext -> Row(Rows简化)
Gorm 的基本使用
Gorm介绍
gorm主要是把struct类型和数据库表记录进行映射,操作数据库的时候不需要直接手写SQL代码
Gorm 特性:
- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持 Preload、Joins 的预加载
- 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
基本用法
连接数据库
首先导入依赖,导入gorm和mysql driver
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
以下代码是我连接我的mysql数据库使用的:
dsn := "root:dir99@tcp(127.0.0.1:3306)/douyin?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("失败")
}
向gorm传入dsn字符串,之后就可以创建与mysql数据库的连接。需要注意的是,创建完连接不要先直接使用,而是要先判断error是否为nil, 验证连接过程中是否出现了异常
创建表和记录
以下代码先根据Video结构体创建出了一条数据 然后使用AutoMigrate(&video)创建出了videos表 使用Db.Create(&video)创建出了videos表中一条特定的数据记录
//video := common.Video{
// AuthorId: 2,
// CommentCount: 0,
// FavoriteCount: 0,
// Id: 1,
// IsFavorite: false,
// PlayUrl: "https://www.w3schools.com/html/movie.mp4",
// CoverUrl: "https://cdn.pixabay.com/photo/2016/03/27/18/10/bear-1283347_1280.jpg",
// Title: "1",
//}
//Db.AutoMigrate(&video)
//Db.Create(&video)
增删改查
- 增: 上面已经说过了,使用Db.Create(&video)可以创建出videos表中一条特定的数据记录
- 查 可以使用Db.First()方法,下面是我的代码示例
if err := Dao.Db.First(&user, "user_name=?", username).Error; err == nil && user.UserPwd == password {
c.JSON(http.StatusOK, common.UserLoginResponse{
Response: common.Response{
StatusCode: 0,
StatusMsg: "登录成功"},
Token: token,
UserID: user.Id})
} else {
c.JSON(http.StatusOK, common.UserLoginResponse{
Response: common.Response{
StatusCode: 1,
StatusMsg: "登录失败"},
Token: token,
UserID: user.Id,
})
}
上面几行代码当中,通过Db.First()查出了数据,并通过判断有没有返回错误来判断是否查询成功
以上就是我结合自己的项目对gorm的理解。