searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

GORM/GEN的基本用法

2023-05-24 01:42:57
819
0

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提供的一个内置模型,它包含了IDCreatedAtUpdatedAt三个字段,这些字段可以帮助我们更方便地管理数据库表。NameAge是我们自定义的字段,表示用户的姓名和年龄。

其次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

https://gorm.io/gen/index.html

0条评论
0 / 1000
瑞te尼尔
4文章数
0粉丝数
瑞te尼尔
4 文章 | 0 粉丝
瑞te尼尔
4文章数
0粉丝数
瑞te尼尔
4 文章 | 0 粉丝
原创

GORM/GEN的基本用法

2023-05-24 01:42:57
819
0

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提供的一个内置模型,它包含了IDCreatedAtUpdatedAt三个字段,这些字段可以帮助我们更方便地管理数据库表。NameAge是我们自定义的字段,表示用户的姓名和年龄。

其次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

https://gorm.io/gen/index.html

文章来自个人专栏
GO
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
2
0