首页 > 数据库 >零基础Go语言从入门到精通(数据库编程:02-Gorm 操作 MySQL 数据库)

零基础Go语言从入门到精通(数据库编程:02-Gorm 操作 MySQL 数据库)

时间:2023-04-03 15:04:02浏览次数:56  
标签:02 return err 数据库 ctx accountInfo MySQL gin gorm


gin-gorm-api-example/main.go at master · cgrant/gin-gorm-api-example · GitHub

https://github.com/cgrant/gin-gorm-api-example/blob/master/main.go

Gorm 介绍

The fantastic ORM library for Golang Go 语言的 超棒的 ORM 类库

功能强大:

  • 全功能ORM(几乎)
  • 关联(包含一个,包含多个,属于,多对多,多种包含)
  • Callbacks(创建/保存/更新/删除/查找之前/之后)
  • 预加载(急加载)
  • 事务
  • 复合主键
  • SQL Builder
  • 自动迁移
  • 日志
  • 可扩展,编写基于GORM回调的插件
  • 每个功能都有测试
  • 开发人员友好

2. 操作 MySQL 数据库

2.1 加载驱动

操作mysql需要 mysql 的驱动,由于我使用 go mod 来管理依赖,直接导入包就行。


import (
_ "github.com/go-sql-driver/mysql"
)


2.2 导入 gorm 包

方法同上,导入包即可。


import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)


2.3 打开数据库

调用 gorm.Open 方法打开数据库


// 创建mysql连接
func Init() {
    DB, err = gorm.Open("mysql", "user:password@/ginsql?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic(nil)
    }
    // 自动迁移模式
    // 解决中文乱码问题
    DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").AutoMigrate(&AccountInfo{})
}


2.4 建表

建表一般采用 数据模型同步的方式,先创建一个 model


// 定义数据模型
type AccountInfo struct {
    gorm.Model
    Name     string `gorm:"not null;unique"`
    Password string `gorm:"not null;"`
    Status   uint   `gorm:"default:0"`
}


我们登录mysql客户端,查看生成的表结构

2.5 封装ORM接口


// ORM 封装接口
type AccountInfoAPI struct{}
func (h *AccountInfoAPI) List(offset, limit int) (accountInfos []AccountInfo) {
    DB.Offset(offset).Limit(limit).Find(&accountInfos)
    return
}
func (h *AccountInfoAPI) Create(accountInfo *AccountInfo) error {
    err := DB.Create(accountInfo).Error
    return err
}
func (h *AccountInfoAPI) Get(id int) (accountInfo AccountInfo) {
    DB.Find(&accountInfo, id)
    return
}
func (h *AccountInfoAPI) Update(id int, updates *AccountInfo) error {
    accountInfo := &AccountInfo{}
    err := DB.Where("id = ?", id).First(&accountInfo).Error
    if err != nil {
        return err
    }
    err = DB.Model(&accountInfo).Updates(updates).Error
    return err
}
func (h *AccountInfoAPI) Delete(id int) error {
    var accountInfo AccountInfo
    err := DB.First(&accountInfo, id).Error
    if err != nil {
        return err
    }
    err = DB.Delete(&accountInfo).Error
    return err
}


func (h *AccountInfoAPI) Count() (int, error) {
    var count int
    var accountInfo AccountInfo
    // 软删除数据不要
    err := DB.Model(&accountInfo).Where("deleted_at is null").Count(&count).Error
    if err != nil {
        return count, err
    }
    return count, err
}


2.6 增删改查

通过gin框架搭建web服务,来增加

2.6.1 创建记录

// gin路由注册函数
func addHandler(ctx *gin.Context) {
    var accountInfo sql.AccountInfo
    if err := ctx.ShouldBindJSON(&accountInfo); err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "msg": err,
        })
        return
    }
if err := api.Create(&accountInfo); err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "msg": err,
        })
        return
    }
    ctx.JSON(http.StatusOK, gin.H{
        "msg":  "success",
        "data": accountInfo,
    })
}

下面我们postman来操作增加信息

执行发送后返回结果

我们在增加一条数据

查看mysql中的表数据

2.6.2 查询list

func listHandler(ctx *gin.Context) {
    offset, limit := 0, 10
// 获取url中参数
    queryOffset := ctx.Query("offset")
    if queryOffset != "" {
// 字符串专为int类型函数
        offset, _ = strconv.Atoi(queryOffset)
    }
    queryLimit := ctx.Query("limit")
    if queryLimit != "" {
        limit, _ = strconv.Atoi(queryLimit)
    }
    ctx.JSON(http.StatusOK, gin.H{
        "msg":  "success",
        "data": api.List(offset, limit),
    })
}

http://localhost:8080/list?offset=0&limit=2

2.6.3 更新

这里介绍按照一条数据id进行数据更新

  • 更新前记录
  • 执行更新操作
  • 更新后的结果

2.6.4 删除

查看数据库(这里是采用软删除:一般公司中核心数据都不能轻而易举删除掉的)

目的:需要对数据进行可查,把删除的状态给变更掉。

2.5.5 count

使用 count 查询(gin 注册的函数)

func countHandler(ctx *gin.Context) {
    count, err := api.Count()
    if err != nil {
        ctx.JSON(http.StatusOK, gin.H{
            "msg": err.Error(),
        })
    }
    ctx.JSON(http.StatusOK, gin.H{
        "msg":  "success",
        "data": count,
    })


通过postman方式的演示如下

2.6.5 gorm快速浏览

Count in GORM - Learn Programming with Real Apps

标签:02,return,err,数据库,ctx,accountInfo,MySQL,gin,gorm
From: https://blog.51cto.com/u_14361901/6166432

相关文章

  • mysql总结
    MyiSAM和innodbMyiSAM:非聚集索引、B+树、叶子结点保存data地址;innodb:聚集索引、B+树、聚集索引中叶子结点保存完整data,innodb非聚集索引需要两遍索引,innoDB要求表必须有主键;innodb为什么要用自增id作为主键:自增主键:顺序添加,页写满开辟新的页;非自增主键(学号等):主键值随机,有碎片......
  • 联芸mas0902固态使用量产工具的开卡方法,mas0902/mas1102开卡软件教程
    MAS0902是一款固态存储器芯片,一般固态硬盘损坏的情况下才需要量产,在量产过程中,需要从量产部落网下载对应主控型号和闪存颗粒类型的量产工具后,使用量产工具来对芯片进行初始化和测试。以下是MAS0902固态使用量产工具的开卡方法:1.首先,将采用MAS0902芯片的固态硬盘短接ROM孔后,连......
  • 2023 省选游记
    省选观光选手的游记。Day0教练破天荒放了一个上午的假,但因为是寄宿生没办法晚起,被迫来机房搞颓。下午动员大会的时候教练非常有激情,讲的很多,大家也都在笑,感觉省选没什么好担心的。回机房看了几个板子和自己21年的省选做题记录。买晚饭的时候,和zzq讨论有什么会考的科技,zzq直接......
  • MySQL(免安装版)下载,安装,配置环境变量【0基础小白用】
    安装版和免安装版的区别:1.安装版自动帮你配置完成,也有安装引导,上来就能用。2.免安装版可在你自己需要的目录中解压,然后手动配置my.ini,配置环境变量,初始化数据库,配置账号密码,比较灵活,但是新人配置需要查看教程。1,下载https://dev.mysql.com/downloads/mysql/注意有32位和64位......
  • 2023.03.29总结
    题目1:洛谷P2024题意有\(n\)个动物,每个动物都是\(A,B,C\)中的一种,其中\(A\)吃\(B\),\(B\)吃\(C\),\(C\)吃\(A\)。给定两种食物链关系。第一种说法是1XY,表示\(X\)和\(Y\)是同类。第二种说法是2XY,表示\(X\)吃\(Y\)。这两种关系有\(k\)条,一条关系......
  • Mysql学习笔记
    1.查看所有数据库showdatabases2.创建数据库createdatabase数据库名3.选择数据库use数据库名4.查看当前数据库下的所有表showtables5.查看表的创建结构,包括创建语句,表的字符集等showcreatetable表名......
  • 【论文速递】MMM2020 - 电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性
    【论文速递】MMM2020-电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性能【论文原文】:ANewLocalTransformationModuleforFew-shotSegmentation【作者信息】:YuweiYang,FanmanMeng,HongliangLi,QingboWu,XiaolongXuandShuaiChen获取地址:https://arxi......
  • 【论文速递】WACV2023 - 循环相似注意力的小样本医学图像分割
    【论文速递】WACV2023-循环相似注意力的小样本医学图像分割【论文原文】:Few-shotMedicalImageSegmentationwithCycle-resemblanceAttention获取地址:https://arxiv.org/pdf/2212.03967.pdf博主关键词:小样本学习,语义分割,自监督,原型摘要:近年来,由于医学影像应用需求的不断提高......
  • 【论文速递】WACV2023 - CellTranspose:用于细胞实例分割的小样本域自适应
    【论文速递】WACV2023-CellTranspose:用于细胞实例分割的小样本域自适应【论文原文】:CellTranspose:Few-shotDomainAdaptationforCellularInstanceSegmentation获取地址:https://openaccess.thecvf.com/content/WACV2023/papers/Keaton_CellTranspose_Few-Shot_Domain_Adap......
  • 【论文速递】PR2023 - 基于自正则原型网络的小样本语义分割
    【论文速递】PR2023-基于自正则原型网络的小样本语义分割【论文原文】:Self-RegularizedPrototypicalNetworkforFew-ShotSemanticSegmentation获取地址:https://arxiv.org/pdf/2210.16829.pdf博主关键词:小样本学习,语义分割,自正则,原型网络摘要:用于图像语义分割的深度cnn通常......