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の型には以下が使用できます。

  • bool
  • int, int8, int16, int32, int64
  • uint, uint8, uint16, uint32, uint64
  • float32, float64
  • string
  • time.Time
  • その型自体がdatabase/sqlsql.Scannerを実装しており、pointerがdatabase/sql/driverdriver.Valuerを実装している型

usersテーブルにidnamecreated_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"
}

results matching ""

    No results matching ""