Configuration
Goの構造体を用いて、Configurationファイルにテーブル構成について記述します。この後のコード生成で同一識別子の構造体や関数が生成されるため、以下のようにコード本体とは異なるbuild tagを設定することをお勧めします。
//go:build genorm
// +build genorm
Table
テーブルはstructで表現します。また、テーブル名はstructのpointerをreceiverにとるTableNameメソッドで返します。
例
usersテーブル
type User struct {
// ColumnやJoin可能なテーブルの情報
}
func (*User) TableName() string {
return "users"
}
Column
カラムについてはstructのfieldとして設定します。カラム名はgenormタグの値として設定します。fieldの型には以下が使用できます。
boolint,int8,int16,int32,int64uint,uint8,uint16,uint32,uint64float32,float64stringtime.Time- その型自体が
database/sqlのsql.Scannerを実装しており、pointerがdatabase/sql/driverのdriver.Valuerを実装している型- ex)
uuid.UUID(github.com/google/uuid)
- ex)
例
usersテーブルにid、name、created_atカラムがある場合
import (
"time"
"github.com/google/uuid"
)
type User struct {
ID uuid.UUID `genorm:"id"`
Name string `genorm:"name"`
CreatedAt time.Time `genorm:"created_at"`
}
Relation
テーブルがJoin可能であることを示します。型がgenorm.Ref[T]であるfieldでRelationを表します。genorm.Refの型パラメーターにはJoin先のテーブルを表すstructを指定します。
また、現在同じテーブルを2回Joinで使うことができません。
このため、User構造体内でUser構造体へgenorm.Refを貼ることは意味がないためできません。
また、現在Join後の識別子の重複防止が不完全です。
このため、User構造体とMessage構造体の間にRelationが貼られており、MessageUserJoinedという構造体で表されるテーブルがある時などに生成されたコードがエラーとなります。
このような場合には構造体名などの調整をしてください。
例
usersテーブルにmessagesテーブルをJoinできる場合
import "github.com/mazrean/genorm"
type User struct {
// Columnの情報
Message genorm.Ref[Message]
}
func (*User) TableName() string {
return "users"
}
type Message struct {
// Columnの情報
}
func (*Message) TableName() string {
return "messages"
}