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

本文的目标

本文力图实现用简短的篇幅,结合一些具体的应用场景来讲述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: "王五"})

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 GORM 连接 MySQL 并进行增删改查的示例代码,已经注释说明每个步骤的作用。 ```go package main import ( "fmt" "gorm.io/driver/mysql" // 导入 MySQL 驱动 "gorm.io/gorm" // 导入 GORM ) type User struct { // 定义 User 结构体 gorm.Model // 继承 GORM 模型结构体,包含 ID、CreatedAt、UpdatedAt、DeletedAt 字段 Name string Age int } func main() { // 1. 连接 MySQL 数据库 dsn := "root:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } defer db.Close() // 程序结束时关闭数据库连接 // 2. 自动迁移数据db.AutoMigrate(&User{}) // 自动创建数据表 // 3. 插入数据 user := User{Name: "Tom", Age: 18} result := db.Create(&user) // 插入数据 if result.Error != nil { panic("failed to create user") } fmt.Println(user.ID) // 输出新插入数据的 ID // 4. 查询数据 var users []User db.Find(&users) // 查询所有数据 fmt.Println(users) var user2 User db.First(&user2, 1) // 根据主键查询单条数据 fmt.Println(user2) var user3 User db.Where("name = ?", "Tom").First(&user3) // 根据条件查询单条数据 fmt.Println(user3) // 5. 更新数据 db.Model(&user).Update("Age", 20) // 更新数据 fmt.Println(user) // 6. 删除数据 db.Delete(&user) // 删除数据 } ``` 注意,这里的 `dsn` 是连接 MySQL 数据库的字符串,其中包含了用户名、密码、主机地址、端口号、数据库名等信息,需要根据实际情况进行修改。同时,这里使用了 GORM 的链式查询语法,通过 `db.Find()` 和 `db.Where()` 方法来查询数据,可以根据实际需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值