1 什么是ORM?它有什么作用?
ORM (Object-Relational Mapping) 是一种编程技术,用于将对象模型和关系数据库之间进行映射。通过使用ORM,开发人员可以使用面向对象的编程语言操作数据库,而不需要直接编写SQL语句。
ORM (全称为 :Object Relative Mapping)对象-关系映射,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
优点:
ORM在软件开发中有很多优点,例如简化了数据库操作,提高了开发效率,减少了代码重复,更易于维护和扩展。它将数据库表映射为对象类,使得开发人员可以使用面向对象的思维来处理数据。
常见ORM框架:
常见的ORM框架包括Hibernate(Java)、Entity Framework (.NET)、Django ORM (Python)、Rails ActiveRecord (Ruby)、Gorm(Go)等。这些框架提供了丰富的功能,如自动生成SQL语句、事务管理、缓存等,使开发人员能够更加专注于业务逻辑的实现。
小结: orm可以实现利用对象操纵数据库中的表。
2 GORM框架简介
GORM 是一个已经迭代了10+年的功能强大的 ORM 框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。
GORM 是一个在 Go 语言中使用的 ORM(对象关系映射)库,它提供了简单且强大的数据库操作功能。GORM 的全称是 Go Object Relational Mapping,它允许开发者通过定义结构体和标签来映射数据库中的表和字段,使得开发者能够使用面向对象的方式来操作数据库。
通过 GORM,你可以方便地进行数据库的增删改查操作,支持多种数据库,如 MySQL、PostgreSQL、SQLite 等,并且提供了一系列功能强大的查询方法和链式操作,如条件查询、排序、分页等。此外,GORM 还支持事务处理、关联查询、预加载等高级功能,使得数据操作更加灵活和高效。
3 GORM的基础使用
对于使用 GORM 进行数据库操作,你可以先定义一个与数据库表对应的结构体,并在结构体的字段上使用标签指定数据库表和字段的映射关系。然后,通过 GORM 提供的 API 来执行增删改查操作。例如,你可以使用 Create 方法插入一条记录,使用 Find 方法查询数据,使用 Update 方法更新数据等。
官方指南:
GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
3.1 Gorm 的约定:
Gorm使用名为ID的字段作为主键。- 如果没有定义
TableName()方法,使用结构体的蛇形复数作为表名。 - 列名为字段名的蛇形小写。
- 使用
CreatedAt、UpdatedAt字段作为创建、更新时间。
3.2 Gorm 支持的数据库:
Gorm 目前支持 MySQL、SQLServer、PostgreSQL、SQLite。Gorm 通过驱动来连接数据库,如果需要连接其它类型的数据库,可以复用/自行开发驱动。
3.3 CRUD操作
package main
import (
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)
// 定义 gorm.Model 结构体,对应数据库中一张表
type Product struct {
gorm.Model // 也可以直接定义 Deleted gorm.DeletedAt
Code string `gorm:"default:D42"` // 设置默认值
Price uint `gorm:"default:200"`
}
// 为 model 定义表名
func (p Product) TableName() string {
return "product"
}
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
// 连接 MYSQL 数据库 https://gorm.cn/zh_CN/docs/connecting_to_the_database.html
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
// 提高性能
SkipDefaultTransaction: true, // 关闭默认事务
PrepareStmt:true, // 缓存预编译语句
})
if err != nil {
panic("failed to connect database")
}
// 迁移 schema
db.AutoMigrate(&Product{})
Create 创建数据
db.Create(\&Product{Code: "D42", Price: 100}) // 一条数据:创建对象
product := \[]\*Product{{Code: "D41"}, {Code: "D42"}, {Code: "D43"}} // 多条数据:创建切片
db.Create(\&product)
Read 查询数据
var product Product
// 查询单条数据
db.First(\&product) // 获取第一条记录(主键升序),没有找到记录时返回 ErrRecordNotFound 错误
db.First(\&product, 1) // 传递整形:根据整形主键查找
db.First(\&product, "code = ?", "D42") // 传递查询条件:查找 Code 字段值为 D42 的记录
// 使用 Find 查询多条数据,不会返回错误
db.Where("code = ?", "D42").Find(\&product) // SELECT \* FROM product WHERE code = 'D42';
Update 更新数据
db.Model(\&product).Where("code = ?", "D42").Update("Price", 200) // 更新单个字段
// 更新多个字段
db.Model(\&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(\&product).Updates(map\[string]interface{}{"Price": 200, "Code": "F42"}) // 可更新零值字段
Delete - 删除数据
// 物理删除:删没了
db.Delete(\&product, 1) // 传递整形:根据整形主键删除
db.Delete(\&product, "code = ?", "D42") // DELETE FROM product WHERE code = 'D42';
// 软删除:GORM 会将 DeletedAt 置为当前时间, 不能再通过正常的查询方法找到该记录。
db.Where("code = ?", "D42").Delete(\&Product{}) // UPDATE product SET deleted\_at="2023-01-20 10:23" WHERE code = 'D42';
db.Unscoped().Where("code = ?", "D42").Find(\&product) // 使用 Unscoped 找到被软删除的记录
}
3.4 GORM事务
Gorm 提供了 Begin、Commit、Rollback 方法用于使用事务。
// Transaction 用于自动提交事务,避免漏写 Rollback()、Commit()
db.Transaction(func(tx \*gorm.DB) error {
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
if err := tx.Create(\&Animal{Name: "Giraffe"}).Error; err != nil {
// 返回任何错误都会回滚事务
return err
}
if err := tx.Create(\&Animal{Name: "Lion"}).Error; err != nil {
return err
}
// 返回 nil 提交事务
return nil
})
3.5 GORM扩展生态
总结
总之,GORM 是一个功能丰富而易于使用的 ORM 库,它简化了在 Go 语言中与数据库进行交互的过程,并提供了许多便捷的操作方法。