DAO概要

Genは、DAOインターフェースを生成するために`Configuration As Code`のプラクティスに従います。設定の概要を以下に示します。

設定

設定は、実行可能な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.dokyumento.jp/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 データベースの列がNULL許容の場合、フィールドの型としてポインタを生成する
FieldCoverable データベースの列にデフォルト値がある場合、ゼロ値の問題を回避するために、フィールドの型としてポインタを生成する。例:https://gorm.dokyumento.jp/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()
}

詳細な使用方法については、以下を参照してください

プラチナスポンサー

ゴールドスポンサー

プラチナスポンサー

ゴールドスポンサー