这是我参与「第三届青训营 - 后端场」笔记创作活动的的第二篇笔记。
1. GORM简介
GORM官方指南gorm.io/zh_CN/docs/…
什么是ORM: ORM让你的数据库里面的表结构变成你代码定义的数据结构(golang里面的结构体的结构)从而做到,代码结构即为数据库结构,代码行为即为数据库行为。
GORM是一个类似于JDBC的接口,隔离开应用程序和具体的数据库驱动,提供了go语言和mysql等各种数据库驱动的交互功能,进而数据库驱动对数据库进行操作。
2. gen框架
2.1 gen框架背景
数据库操作是大多数程序员必不可少的工作,GORM 作为一个拥有 25k star 的项目已经是 Go 语言操作关系型数据库的首选。
由于 GORM 中提供了很多 interface{} 形式的参数,这让程序员很容易误用,导致线上项目存在 SQL 注入的风险。 在操作数据库时候,因为没有对应的结构体可以绑定,最后只能默默的拼接出一条 SQL 去执行。 复杂的数据库表查询场景时,开发者需逐条手写数据表中的列与对应结构体的成员变量,逐条核对字段类型。
由此,字节跳动无恒实验室与 GORM 作者(github.com/jinzhu) 联合研发的开源工具 GEN 出现了。
注意GEN只提供了CURD相关的一些功能,并没有提供创建表,所以需要用gorm进行表的创建。
2.2 gen框架的基本使用
最佳实践项目模板:
demo
├── cmd
│ └── generate
│ └── generate.go # execute it will generate codes
├── dal
│ ├── dal.go # create connections with database server here
│ ├── model
│ │ ├── method.go # DIY method interfaces
│ │ └── model.go # store struct which corresponding to the database table
│ └── query # generated code's directory
| ├── user.gen.go # generated code for user
│ └── gen.go # generated code
| └── user.gen_test.go # generated unit test
├── biz
│ └── query.go # call function in dal/gorm_generated.go and query databases
├── config
│ └── config.go # DSN for database server
├── generate.sh # a shell to execute cmd/generate
├── go.mod
├── go.sum
└── main.go
2.2.1 通过gorm来创建表
先进行全局初始化
var DB *gorm.DB
var once sync.Once
func init() {
once.Do(func() {
DB = ConnectDB()
})
}
func ConnectDB() (conn *gorm.DB) {
var err error
conn, err = gorm.Open(mysql.Open(config.MySQLDSN))
if err != nil {
panic(fmt.Errorf("cannot establish db connection: %w", err))
}
return conn
}
我再额外创建一个main包进行数据库table的建立
func main() {
err := dal.DB.AutoMigrate(model.User{})
if err != nil {
fmt.Println("Create mysql table failed")
} else {
fmt.Println("Create mysql table successful")
}
}
2.2.2 gen的代码生成
运行 cmd/generate/generate.go 生成结构代码
2.2.3 main函数进行CRUD功能使用
直接使用 biz/query.go 中封装好的功能