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 更新表中的数据,我们可以使用 Save,Update,Updates 等方法,传入一个模型的实例或指针,以及一些可选的条件和值。是一个组合函数。 如果保存值不包含主键,它将执行 Create,否则它将执行 Update。Update 更新单列,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 从表中查询数据,我们可以使用 Find,First 等方法,传入一个模型的实例或指针,以及一些可选的条件。第一条语句为查询username等于tom的记录。第二条语句为查询username不等于name的全部记录。
// 获取单个匹配的记录
db.Where("username = ?", "tom").First(&user)
// 获取全部匹配的记录
db.Where("username <> ?", "tom").Find(&users)
事务
事务是数据库管理系统中的一个重要概念,它指的是一组不可分割的数据库操作序列,这些操作要么全部成功执行,要么全部不执行,以确保数据库的完整性和一致性。事务具有以下几个关键特性,通常被称为ACID特性:
- 原子性(Atomicity) : 事务中的所有操作要么全部完成,要么全部不完成。如果事务中的某个操作失败,整个事务将回滚到事务开始前的状态,就像这个事务从未执行过一样。
- 一致性(Consistency) : 事务必须确保数据库从一个一致性状态转换到另一个一致性状态。一致性状态意味着数据库中的数据必须满足特定的规则和约束,例如数据的完整性约束。
- 隔离性(Isolation) : 并发执行的事务之间不会相互影响。事务的隔离性确保了并发事务的执行不会导致数据的不一致性。不同的数据库系统可能提供不同级别的隔离性,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
- 持久性(Durability) : 一旦事务被提交,它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。持久性通常通过将事务的修改写入到持久存储来实现。
控制事务的流程
// 开始事务
tx := db.Begin()
// 在事务中执行一些 db 操作
tx.Create(...)
// ...
// 遇到错误时回滚事务
tx.Rollback()
// 否则,提交事务
tx.Commit()