Gorm | 青训营笔记

167 阅读4分钟

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

Gorm

理解数据库

数据库的起源?

数据库的起源: 随着互联网时代的到来,需要持久化数据呈现井喷式发展,常规的 io操作虽然 可以满足持久化的需求, 但是,对于持久化的目的,对数据的操纵,显然力不从心, 且操作的复杂度很大,不利于大规模的发展,审时度势,数据库应运而生。

数据库是什么?

数据库,又称为数据管理系统,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的资料执行新增、截取、更新、删除等操作 所谓“数据库”是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。一个数据库由多个表空间(Tablespace)构成。

数据库的分类

根据存储模型可将数据库划分为关系型数据库和非关系型数据库。关系型数据库, 是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库 中的数据。 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是 由二维表及其之间的联系所组成的一个数据组织。标准数据查询语言SQL 就是一种 基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。

  • 关系型数据库,常用的关系型数据库有

    • MySQL,MySQL也是我现在使用最多的数据库
    • Microsoft SQL Server
    • Oracle
  • 非关系型数据库,常用的非关系型数据库有:

    • MongoDB
    • Redis

数据库的基本用法?

  • 导入要使用的数据库的driver
  • 初始化DB连接
  • 执行sql语句实现操作

数据库的设计原理

img.png 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的理解。