Defined Type

genorm.ExprTypeinterfaceを満たす独自型を定義することで、さらに強力にSQLのミスを防止できます。

Usageの例として使用したConfigurationファイルではmessagesテーブルのidカラムとuser_idカラムは共にuuid.UUID型となっています。このため、

messageValues, err := genorm.
    Select(orm.Message()).
    Where(genorm.Eq(message.IDExpr, message.UserIDExpr)).
    GetAll(db)

のようなコードはコンパイルエラーとなりません。

しかし、messageのidとuserのidを比較したい場合はほとんどないはずです。

このような時に

type MessageID uuid.UUID

func (mid *MessageID) Scan(src any) error {
    return (*uuid.UUID)(mid).Scan(src)
}

func (mid MessageID) Value() (driver.Value, error) {
    return uuid.UUID(mid).Value()
}

type UserID uuid.UUID

func (uid *UserID) Scan(src any) error {
    return (*uuid.UUID)(uid).Scan(src)
}

func (uid UserID) Value() (driver.Value, error) {
    return uuid.UUID(uid).Value()
}

のようなDefined Typeを定義し、Configurationファイルのmessagesテーブルのidカラムとuser_idカラムをそれぞれMessageID型、UserID型にします。

このようにすることで、messageのidとuserのidを別の型として扱うことができ、

messageValues, err := genorm.
    Select(orm.Message()).
    Where(genorm.Eq(message.IDExpr, message.UserIDExpr)).
    GetAll(db)

がコンパイルエラーとなります。

results matching ""

    No results matching ""