后端实践:GORM | 豆包MarsCode AI 刷题

58 阅读4分钟

GORM是什么

GORM(Go Object-Relational Mapping)是Go语言ORM(对象关系映射)库,它允许开发者使用Go语言对象来操作数据库。GORM通过将数据库中的表映射到Go语言的结构体上,使得开发者可以用面向对象的方式来处理数据库操作,而不需要编写大量的SQL语句,因此开发效率得到大大的提升。

GORM与mysql的驱动安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

连接数据库

本次实践中我mysql的账号为root,密码为123456,数据库为test

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

func main() {   
    dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"   
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

创建表

要使用 gorm 对数据库中的表进行操作,需要先定义一个 golang 结构体,这个结构体就是我们的模型。假设我们需要创建一张users表,表中包含两个字段一个username,一个email。则我们需要用golang编写如下一个结构体。gorm约定使用结构体蛇形复数作为表名,字段的蛇形作为列名。使用 gorm 的 AutoMigrate 方法来自动创建表。

type User struct {
    Username string `gorm:"primaryKey"` 
    Email    string `gorm:"unique"`     
}

err := db.AutoMigrate(&User{})

使用 gorm 向表中插入数据,我们可以使用 Create 方法,传入一个模型的实例。值得注意的是,无法向 Create 方法传递结构体,所以应该传入数据的指针。

user := User{ 
    Username: "tom",
    Email: "tom@163.com",
}
res := db.Create(&user)

gorm还可以同时创建多条记录

users := []*User{ 
    {Username: "jack",Email: "jack@163.com"},
    {Username: "lisa",Email: "lisa@163.com"},
    {Username: "curry",Email: "curry@163.com"},
}
res := db.Create(users)

使用 gorm 删除表中的数据,我们可以使用 Delete 方法,传入一个模型的实例或指针,以及一些可选的条件。这个方法会根据我们的模型和条件来生成对应的 SQL 语句。该语句为删除username为bob的记录。

db.Delete(&User{}, "username = ?", "bob")

使用 gorm 更新表中的数据,我们可以使用 SaveUpdateUpdates 等方法,传入一个模型的实例或指针,以及一些可选的条件和值。是一个组合函数。 如果保存值不包含主键,它将执行 Create,否则它将执行 UpdateUpdate 更新单列,Updates 更新多个列。

db.Save(&User{Username: James, Email: 100})
db.Model(&User{}).Where("username = ?", job).Update("email", "job@163.com")
db.Model(&User{}).Updates(map[string]interface{}{"username": "kity", "email": kity@qq.com})

使用 gorm 从表中查询数据,我们可以使用 FindFirst 等方法,传入一个模型的实例或指针,以及一些可选的条件。第一条语句为查询username等于tom的记录。第二条语句为查询username不等于name的全部记录。

// 获取单个匹配的记录
db.Where("username = ?", "tom").First(&user)

// 获取全部匹配的记录
db.Where("username <> ?", "tom").Find(&users)

事务

事务是数据库管理系统中的一个重要概念,它指的是一组不可分割的数据库操作序列,这些操作要么全部成功执行,要么全部不执行,以确保数据库的完整性和一致性。事务具有以下几个关键特性,通常被称为ACID特性:

  1. 原子性(Atomicity) : 事务中的所有操作要么全部完成,要么全部不完成。如果事务中的某个操作失败,整个事务将回滚到事务开始前的状态,就像这个事务从未执行过一样。
  2. 一致性(Consistency) : 事务必须确保数据库从一个一致性状态转换到另一个一致性状态。一致性状态意味着数据库中的数据必须满足特定的规则和约束,例如数据的完整性约束。
  3. 隔离性(Isolation) : 并发执行的事务之间不会相互影响。事务的隔离性确保了并发事务的执行不会导致数据的不一致性。不同的数据库系统可能提供不同级别的隔离性,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
  4. 持久性(Durability) : 一旦事务被提交,它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。持久性通常通过将事务的修改写入到持久存储来实现。

控制事务的流程

// 开始事务
tx := db.Begin()
// 在事务中执行一些 db 操作
tx.Create(...)
// ...
// 遇到错误时回滚事务
tx.Rollback()
// 否则,提交事务
tx.Commit()