Gorm实现数据库增删查改——mysql篇

发布时间 2023-08-22 23:38:06作者: Johnson-Hugo

本文的目标

本文力图实现用简短的篇幅,结合一些具体的应用场景来讲述gorm基本的增删查改功能。

Gorm介绍

在现代软件开发中,数据库操作是构建应用程序不可或缺的一部分。

GORM是Go语言的一个ORM(Object Relational Mapping)库。它可以让我们通过Go来操作数据库中的数据。其中ORM(Object Relational Mapping:对象关系映射)是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。其有如下特点:

  • 全功能 ORM

  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)

  • Create,Save,Update,Delete,Find 中钩子方法

  • 支持 PreloadJoins 的预加载

  • 事务,嵌套事务,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框架引入

go get -u gorm.io/gorm

定义模型结构

在做具体的增删查改之前,我们要根据自身的需求来定义结构体,以相应的结构体为依托。这里以UserInfo表为例:

type UserInfo struct {  
    Avatar string // 用户头像  
    BackgroundImage string // 用户个人页顶部大图  
    FavoriteCount int64 // 喜欢数  
    FollowCount int64 // 关注总数  
    FollowerCount int64 // 粉丝总数  
    ID int64  // 用户id  
    IsFollow bool // true-已关注,false-未关注  
    Name string // 用户名称  
    Signature string // 个人简介  
    TotalFavorited int64 // 获赞数量  
    WorkCount int64 // 作品数  
}

数据库创建

在mysql中创建表,sql语句如下:

create table user_infos
(
    avatar           longtext   null,
    background_image longtext   null,
    favorite_count   bigint     null,
    follow_count     bigint     null,
    follower_count   bigint     null,
    id               bigint auto_increment
        primary key,
    name             longtext   null,
    signature        longtext   null,
    total_favorited  bigint     null,
    work_count       bigint     null,
    is_follow        tinyint(1) null
);

同时,我们也可以使用gorm中的db.AutoMigrate(&User{})方法来实现数据库的自动创建。对结构体相关条目进行标记可以指定主键和自增等操作:

ID int64 `gorm:"primaryKey"`
// 用primaryKey标记主键

Mysql连接

Gorm连接

mysqlInfoString = fmt.Sprintf("%s:%s@%s(%s:%d)/%s?parseTime=true",  
mysqlConf.Username, mysqlConf.Password, mysqlConf.Protocol, mysqlConf.Url, mysqlConf.Port,  
mysqlConf.Dbname)  
mysqlDb, err := sql.Open("mysql", mysqlInfoString)
GormDb, err := gorm.Open(mysql.Open(mysqlInfoString), &gorm.Config{})
// Username:数据库用户名 Password:数据库登录密码 Protocol:数据库协议(指明是哪种数据库)
// URL:数据库地址 Port:数据库端口 Dbname:具体要读取的数据库名称

CURD基本操作

  1. Create 新增记录
var userAccount = &TableEntity.UserAccountInfo{  
    UserID: userId,  
    Password: password,  
    Username: rUser.Username,  
}
tx.Create(userAccount)

这里通过给相应的结构体进行赋值,再调用Create函数实现表项的创建

同时,我们还可以对数据库表项进行批量创建,只需创建相应的切片,步骤如下:

var users = []TableEntity.UserAccountInfo{
    {
        UserID: 1, Password: "25123",Username: "张三" 
        },
    {   UserID: 2, Password: "12wqe", Username: "李四"
        }, 
} 
db.Create(&users)
  1. Where 记录查询

在mysql中语句中where语句是最为灵活与多样化的存在,通过指定相应的查询语句即可实现多样化的功能查询,举例如下:

mysqldb.Model(&TableEntity.UserAccountInfo{}).Where("username =?", username).Find(&num)

上述语句通过db.Model指定要查询的表项(通过grom指定创建相关表项的结构体),where方法中给出相关的查询语句,用Find方法来接受查询到的表项并转化为相应的结构体实例

  1. Delete 记录删除

负责指定主键删除mysql数据库中指定的表项,不指定主键就会触发批量删除,这点需要注意

mysqldb.Delete(&TableEntity.UserAccountInfo{}, 10)

其中TableEntity.UserAccountInfo{}是与数据库相对应的表项,10是主键的值

  1. Update 记录更新

更新数据库中相关记录

mysqldb.Model(&TableEntity.UserAccountInfo{}).Where("user_iD = ?", 30).Updates(TableEntity.UserAccountInfo{Password: "25123", Username: "王五"})

上述即通过指定了相应的条件对满足条件的表项进行了修改与更新