使用GORM连接数据库并实现增删改查操作 | 青训营

59 阅读2分钟

GORM是一个已经迭代10年+的功能强大的ORM框架,在字节内部被广泛使用。同时,GORM拥有非常丰富的开源扩展,支持读写分离等。
Gorm的默认约定:
①Gorm使用名为ID的字段作为主键
②使用结构体的蛇形负数作为表名
③字段名的蛇形作为列名
④使用CreatedAt、UpdatedAt字段作为创建、更新时间
下面我将使用GORM连接数据库并实现增删改查操作。

一、连接数据库

以下是使用GORM连接数据库的代码(GORM目前支持MySQL、SQLServer、PostgreSQL、SQLite这四个主流数据库,GORM通过驱动来连接数据库):

package main

import ( 
    "fnt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm" 
) 

type Student struct{
    ID   uint    'gorm:"primarykey"'
    Name string  'gorm:"column: name"'
    Age  int     'gorm:"column: user_id"'
}

func main() {
    db, err := gorm.Open(
        mysql.Open(dsn), 
        &gorm.Config{})
    if err != nil {
        panic("Failed to connect to database") 
    }
}

二、增删改查四操作

2.1 增加数据(Create)

stu := Student{Name: "Tom", Age:18}
db.Create(&stu)

注:上方代码为新增一条数据的方法。
在需要创建多条数据的时候,需要使用切片(即数组)的方法。

2.2 更新数据(Update)

-条件更新单个列

db.Model(&Student{}).Where("id = ?", 1).Update("name", "Sunny")

-更新多个列

db.Model(&Student{ID:1}).Updates(Student{Name: "Amy", Age: 20})//仅更新非零值字段
db.Model(&Student{ID:1}).Updates(map[string]interface{}{"Name": "Amy", "Age": 20, "actived": false})//此方法可以用来更新零值字段

注:①Updates支持传入一个结构体或map。
②使用Struct更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段。

2.3 查询数据(Read)

db.Where("Name = ?", "Amy").First(&student)//查询第一条匹配的记录
db.Where("Name = ? AND age <= ?", "Amy", "20").Find(&students)//AND查询

注:①First支持传进结构体,但注意一定要是指针,在使用First时,查询不到数据会返回ErrRecordNotFound。
②使用Find查询多条数据,查询不到数据不会返回错误。
③当使用结构体作为查询条件时,GORM只会查询非零值字段。这意味着如果字段值为0、false或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。

2.4 删除数据(Delete)

db.Delete(&Student{}, 17)

注:对于一条数据的删除,删除对象需要指定主键。

我们可以使用Unscoped永久性删除数据:

db.Unscoped().Where("name = ?","Tom").Delete(&Student{})

注:我们还可以使用Unscoped找到被软删除的数据。

通过对GORM库的学习,我们可以很容易地去连接数据库,并且在数据库中执行增删改查的四种操作,这可以大大提高开发的效率。