GORM实现数据库的增删改查操作(上) | 青训营

291 阅读4分钟

此文章分为上下两部分,在上一部分我们将介绍GORM并实现对MySQL的增删改查操作,在下一部分我们将介绍GORM的事务、Hook以及生态扩展。

1 GORM的介绍

在现代软件开发中,数据库操作是构建应用程序不可或缺的一部分。无论是存储用户数据、管理业务信息还是处理大量数据,数据库都扮演着至关重要的角色。然而,手动编写复杂的数据库操作代码可能会变得繁琐而容易出错。为了提高开发效率并确保数据操作的正确性,ORM(对象关系映射)成为了开发者的首选之一。

GORM(Go Object Relational Mapping)是一个流行的 Go 语言 ORM 框架,它为开发者提供了在应用程序中进行数据库增删改查(CRUD)操作的便捷方法。通过 GORM,开发者可以使用面向对象的方式来处理数据库,从而更专注于业务逻辑的实现,而不必过多关注底层 SQL 查询语句的编写和细节。

本文将介绍如何使用 GORM 实现数据库的增、删、改、查操作。我们将从连接数据库开始,逐步展示如何定义模型、执行数据的插入、更新、删除和查询操作。无论您是初学者还是有经验的开发者,都可以通过本文了解如何充分利用 GORM 框架来管理和操作数据库,从而提高开发效率和代码质量。

本文章数据库使用MySQL实现对MySQL的增删改查操作。

2 前置操作

2.1 定义模型结构

首先我们需要根据实际情况来定义数据库表以及对应对应的模型结构体,本文以用户表(user)为例:

type User struct {
    Username string`gorm:"primaryKey;size:20"` 
    Password string`gorm:"size:20"` 
    Realname string`gorm:"size:10"` 
    Mobile string`gorm:"size:11"` 
    Age int 
}

2.2 数据库的创建

然后创建user表,对应的sql如下:

DROPTABLEIFEXISTS `user`;
CREATETABLE `user`  (
`username` char(20) CHARACTERSET utf8 COLLATE utf8_general_ci NOTNULLDEFAULT'',
`password` varchar(20) CHARACTERSET utf8 COLLATE utf8_general_ci NOTNULL,
`realname` char(10) CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULL,
`mobile` char(11) CHARACTERSET utf8 COLLATE utf8_general_ci NULLDEFAULTNULL,
`age` intNULLDEFAULTNULL,
PRIMARYKEY (`username`) USING BTREE
) ENGINE = InnoDB CHARACTERSET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;  

我们除了可以自己写一个sql创建表外,在连接数据库的情况下还可以使用db.AutoMigrate(&User{})直接根据模型结构创建数据库。数据库的连接见第三章。
到此,前置操作就已经全部完成。

3 MySQL的连接

连接MySQL仅需要一行gorm.Open(mysql.Open(dsn), &gorm.Config{})就可以实现,其中dsn的格式为user:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local

我们可以直接如下封装连接

var DB *gorm.DB
func Init(user string, pwb string, database string) (*gorm.DB, error) {
    dsn := fmt.Sprintf("%s:%s@tcp(localhost:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, pwb, database)
    DB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
       fmt.Println("连接失败:", err, "\n", dsn)
       return nil, err
   }
    fmt.Println("连接成功:", dsn)
    return DB, nil
}

4 数据库的操作

在获取连接db后,我们就可以对数据库进行增删改查了。

4.1 创建数据

db.Create(&model)
db.Create(models)

models类型为[]*moldelType

4.2 查询数据

db.First(&model,conds)
db.Where(query).Find(models)//查询多条语句,query为约束条件

conds既可以是主键值,也可以是查询条件,如db.First(&user,"username=?","totoo")

First查询结果为空时会返回ErrRecordNotFound,Find不会返回错误,会返回查询结果的一些信息,可使用.Error查看错误,使用.RowsAffected查看返回条数。

Where可以有以下几种填法:

Where("mobile in ?",[]string{val1,...})//mobile in(val1,...)

Where("mobile like ? and age>=?","138%",18)//mobile in(val1,...)

Where(modelType{column:value,...})

Where(map[string]interface{}{column:value,...})

4.3 更新数据

db.Model.(&model).Where(query).Update(column,value)

db.Model.(&model).Update(column,value)

db.Model.(&model).Update(modelType{column:value,...})//更新多个字段,仅更新非0值字段

db.Model.(&model).Update(map[string]interface{}{column:value,...})//第二种方式

db.Model.(&model).Select(query).Update(*)//只更新query中的字段

db.Model.(&model).Update(column,gorm.Expr(expr))//表达式更新,expr与query用法大致一样

4.4 删除数据

物理硬删除

db.Delete.(&model,conds)
db.Where(query).Delete.(&model,conds)

软删除

软删除需要为model新增Deleted gorm.DeleteAt字段,在查询时使用db.Where(*).Find(*)会忽略软删记录,使用db.Unscoped().Where(*).Find(*)则不会

下一部分GORM实现数据库的增删改查操作(下)