为了将数据库驱动与框架主库解耦,从 v2.1 版本开始,所有的数据库驱动都需要通过社区包手动引入。
v2.1
数据库驱动的安装和引入请参考: https://github.com/gogf/gf/tree/master/contrib/drivers
GoFrame 框架的 ORM 功能由 gdb 模块实现,用于常用关系型数据库的 ORM 操作。
GoFrame
ORM
gdb
gdb 数据库引擎底层采用了 链接池设计 ,当链接不再使用时会自动关闭,因此链接对象不用的时候不需要显式使用 Close 方法关闭数据库连接。
Close
注意:为提高数据库操作安全性,在 ORM 操作中不建议直接将参数拼接成 SQL 字符串执行,建议使用预处理的方式(充分使用 ? 占位符)来传递 SQL 参数。 gdb 的底层实现中均采用的是预处理的方式处理开发者传递的参数,以充分保证数据库操作安全性。
SQL
?
接口文档:
https://pkg.go.dev/github.com/gogf/gf/v2/database/gdb
GoFrame ORM 组件具有以下显著特点:
GoFrame ORM
OpenTelemetry
Scan
Map/Struct
nil
sql.ErrNoRows
Map/Struct/Slice
DAO
Model/DAO
DryRun
Handler
GoFrame ORM Features
GoFrame ORM Dependencies
g.DB
gdb.New
gdb.Instance
获取数据库操作对象有三种方式,一种是使用 g.DB 方法(推荐),一种是使用原生 gdb.New 方法,还有一种是使用包原生单例方法 gdb.Instance ,而第一种是推荐的使用方式。这三种方式的区别如下:
有这么多对象获取方式原因在于 GoFrame 是一个模块化设计的框架,每个模块皆可单独使用。
New
db, err := gdb.New(gdb.ConfigNode{ Link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test",
// 获取默认配置的数据库对象(配置名称为"default") db := g.DB() // 获取配置分组名称为"user"的数据库对象 db := g.DB("user") // 使用原生单例管理方法获取数据库对象单例 db, err := gdb.Instance() db, err := gdb.Instance("user")
请问 orm 可以支持 hooks 操作吗?这样清理缓存就可以方便很多,且同一个 model 对应的多个缓存也可以一并清理
如:
_, err := db.Table("user").Cache(-1, "vip-user").Data(gdb.Map{"name": "smith"}).Where("uid", 1).Update()
就可以改造为:
_, err := db.Table("user").Data(gdb.Map{"name": "smith"}).Where("uid", 1).Update() func afterSave(instance) { g.Redis().Do("del", "vip-user") g.Redis().Do("del", <其他 key>)