DAO 概述

生成器遵循 代码即配置 的实践来生成 DAO 接口,以下是配置的介绍。

配置

您需要将配置编写为可运行的 Golang 程序,通常,该程序将组织在应用程序的子目录中。

// configuration.go
package main

import (
"gorm.io/gen"
"gorm.io/gorm"
"gorm.io/driver/sqlite"
)

func main() {
// Initialize the generator with configuration
g := gen.NewGenerator(gen.Config{
OutPath: "../dal", // output directory, default value is ./query
Mode: gen.WithDefaultQuery | gen.WithQueryInterface,
FieldNullable: true,
})

// Initialize a *gorm.DB instance
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})

// Use the above `*gorm.DB` instance to initialize the generator,
// which is required to generate structs from db when using `GenerateModel/GenerateModelAs`
g.UseDB(db)

// Generate default DAO interface for those specified structs
g.ApplyBasic(model.Customer{}, model.CreditCard{}, model.Bank{}, model.Passport{})

// Generate default DAO interface for those generated structs from database
companyGenerator := g.GenerateModelAs("company", "MyCompany"),
g.ApplyBasic(
g.GenerateModel("users"),
companyGenerator,
g.GenerateModelAs("people", "Person",
gen.FieldIgnore("deleted_at"),
gen.FieldNewTag("age", `json:"-"`),
),
)

// Execute the generator
g.Execute()
}

运行上述程序,它将在目录 ../dal 中生成代码,您可以在应用程序中导入 dal 包并使用其接口查询数据

gen.Config

type Config struct {
OutPath string // query code path
OutFile string // query code file name, default: gen.go
ModelPkgPath string // generated model code's package name
WithUnitTest bool // generate unit test for query code

FieldNullable bool // generate pointer when field is nullable
FieldCoverable bool // generate pointer when field has default value, to fix problem zero value cannot be assign: https://gorm.golang.ac.cn/docs/create.html#Default-Values
FieldSignable bool // detect integer field's unsigned type, adjust generated data type
FieldWithIndexTag bool // generate with gorm index tag
FieldWithTypeTag bool // generate with gorm column type tag

Mode GenerateMode // generator modes
}

输出选项

选项名称 描述
OutPath 生成器的输出目标文件夹,默认值: ./query
OutFile 查询代码文件名,默认值: gen.go
ModelPkgPath 生成的 DAO 包的包名,默认值: model
WithUnitTest 为 DAO 包生成单元测试,默认值: false

生成结构体选项

选项名称 描述
FieldNullable 如果数据库中的列允许为空,则生成指针作为字段的类型
FieldCoverable 如果数据库中的列具有默认值,则生成指针作为字段的类型,以避免零值问题,例如: https://gorm.golang.ac.cn/docs/create.html#Default-Values
FieldSignable 根据数据库中列的数据类型使用可签名类型作为字段的类型
FieldWithIndexTag 使用 gorm index 标签生成
FieldWithTypeTag 使用 gorm type 标签生成,例如: gorm:"type:varchar(12)",默认值: false

有关更多选项,请参阅 数据库到结构体

生成器模式

标签名称 描述
gen.WithDefaultQuery 生成全局变量 Q 作为 DAO 接口,然后您可以像这样查询数据: dal.Q.User.First()
gen.WithQueryInterface 生成查询 API 接口而不是结构体,通常用于模拟测试
gen.WithoutContext 生成没有上下文约束的代码,然后您可以在不传递上下文的情况下查询数据,例如: dal.User.First(),或者您必须使用上下文查询,例如: dal.User.WithContext(ctx).First()

DAO 接口

生成的 DAO 查询接口示例

type IUserDo interface {
// Create
Create(values ...*model.User) error
CreateInBatches(values []*model.User, batchSize int) error
Save(values ...*model.User) error

// Query
Clauses(conds ...clause.Expression) IUserDo
As(alias string) gen.Dao
Columns(cols ...field.Expr) gen.Columns
Not(conds ...gen.Condition) IUserDo
Or(conds ...gen.Condition) IUserDo
Select(conds ...field.Expr) IUserDo
Where(conds ...gen.Condition) IUserDo
Order(conds ...field.Expr) IUserDo
Distinct(cols ...field.Expr) IUserDo
Omit(cols ...field.Expr) IUserDo
Join(table schema.Tabler, on ...field.Expr) IUserDo
LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo
RightJoin(table schema.Tabler, on ...field.Expr) IUserDo
Group(cols ...field.Expr) IUserDo
Having(conds ...gen.Condition) IUserDo
Limit(limit int) IUserDo
Offset(offset int) IUserDo
Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo
Unscoped() IUserDo
Pluck(column field.Expr, dest interface{}) error
Attrs(attrs ...field.AssignExpr) IUserDo
Assign(attrs ...field.AssignExpr) IUserDo
Joins(fields ...field.RelationField) IUserDo
Preload(fields ...field.RelationField) IUserDo

Count() (count int64, err error)
FirstOrInit() (*model.User, error)
FirstOrCreate() (*model.User, error)
Returning(value interface{}, columns ...string) IUserDo

First() (*model.User, error)
Take() (*model.User, error)
Last() (*model.User, error)
Find() ([]*model.User, error)
FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.User, err error)
FindInBatches(result *[]*model.User, batchSize int, fc func(tx gen.Dao, batch int) error) error
FindByPage(offset int, limit int) (result []*model.User, count int64, err error)
ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
Scan(result interface{}) (err error)

// Update
Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
Updates(value interface{}) (info gen.ResultInfo, err error)
UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
UpdateFrom(q gen.SubQuery) gen.Dao

// Delete
Delete(...*model.User) (info gen.ResultInfo, err error)

// Common
Debug() IUserDo
WithContext(ctx context.Context) IUserDo
WithResult(fc func(tx gen.Dao)) gen.ResultInfo

ReadDB() IUserDo
WriteDB() IUserDo
}

使用示例

  • 如果启用了 gen.WithDefaultQuery,则使用全局变量 Q
import "your_project/dal"

func main() {
// Initialize a *gorm.DB instance
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})

dal.SetDefault(db)

// query the first user
user, err := dal.Q.User.First()
}
  • 初始化 DAO 查询接口
import "your_project/dal"

var Q dal.Query

func main() {
// Initialize a *gorm.DB instance
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})

Q = dal.Use(db)

// query the first user
user, err := Q.User.First()
}

有关更多使用细节,请查看

白金赞助商

黄金赞助商

白金赞助商

黄金赞助商