Gorm是一种流行的Go语言ORM(对象关系映射)框架,它可以帮助开发人员轻松地处理数据库操作。GORM作为ORM框架并没有提供任何辅助代码开发的功能,导致面对较为复杂的数据库表查询场景时,开发者需逐条手写数据表中的列与对应结构体的成员变量,单调且重复的查询功能也需要手动复制,稍不注意就会造成不易察觉的拼写错误。GEN是一个基于GORM的安全ORM框架,其主要通过代码生成方式实现GORM代码封装。旨在安全上避免业务代码出现SQL注入,同时给研发带来最佳用户体验。
1.安装
go get -u gorm.io/gorm
go get -u gorm.io/gen
使用gen同样需要安装gcc环境,配置gcc在系统PATH上。
2.GEN的特性
-
Idiomatic & Reusable API from Dynamic Raw SQL
-
100% Type-safe DAO API without
interface{}
-
Database To Struct follows GORM conventions
-
GORM under the hood, supports all features, plugins, DBMS that GORM supports
3.基本使用
本演示项目的目录结构如下:
在使用Gen工具之前,我们需要定义一个Go结构体来表示数据库表结构。例如,我们可以创建一个名为User
的结构体,表示一个用户表:model.User{}
type User struct {
gorm.Model
Name string
Age int
}
这个结构体中,gorm.Model
是Gorm提供的一个内置模型,它包含了ID
、CreatedAt
和UpdatedAt
三个字段,这些字段可以帮助我们更方便地管理数据库表。Name
和Age
是我们自定义的字段,表示用户的姓名和年龄。
其次main.go
函数的主要内容如下:
package main
import (
"gen_example/model"
"gorm.io/driver/sqlite"
"gorm.io/gen"
"gorm.io/gorm"
)
// Dynamic SQL
type Querier interface {
// SELECT * FROM @@table WHERE name = @name{{if age != 0}} AND age = @age{{end}}
FilterWithNameAndAge(name string, age int) ([]gen.T, error)
}
func main() {
g := gen.NewGenerator(gen.Config{
OutPath: "../query",
Mode: gen.WithoutContext | gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode
})
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) // use sqlite database
if err != nil {
panic("failed to connect database")
}
g.UseDB(db)
// Generate basic type-safe DAO API for struct `model.User` following conventions
g.ApplyBasic(model.User{})
// Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User`
g.ApplyInterface(func(Querier) {}, model.User{})
// Generate the code
g.Execute()
}
执行上述代码,在项目根目录下会得到一个新的文件夹query
。
其中,users.gen.go
文件中包含了再main.go
函数中定义的接口,与其具体的实现函数:
接下来,我们可以使用AutoMigrate
函数来自动创建数据库表。这个函数会根据我们定义的Go结构体自动生成对应的数据库表。可以使用以下代码来创建User
表:
err = db.AutoMigrate(&User{})
if err != nil {
panic("failed to migrate database")
}
现在,我们已经成功在数据库中创建了User
表,现在我们可以在代码中使用它了。
先使用基础的DAO API
来创建一个用户:
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
q := query.Use(db)
// Basic DAO API
err = q.User.Create(&model.User{
Name: "test1",
Age: 18,
})
if err != nil {
fmt.Println(err.Error())
}
}
接下来使用动态的DAO API
来查询:
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
q := query.Use(db)
// Dynamic SQL API
users, _ := q.User.FilterWithNameAndAge("test1", 18)
fmt.Println(users)
}
这样我们就完成了一个gen
的基本使用流程了。
4. 总结
Gorm的Gen工具是一个非常方便的工具,可以帮助开发人员快速生成数据库表结构的代码。使用Gen工具可以大大减少开发人员的工作量,并且可以避免手动编写表结构代码可能带来的错误。在本文中,我们介绍了如何使用Gen工具来动态生成数据库ORM操作,希望能够帮助您更加高效地使用Gorm ORM框架。有关于Gen更多的操作请参考Gen官方文档。
5.参考
https://security.bytedance.com/techs/wuheng-lab-better-orm-gen