Value Type
GenORMではSQLの表現を以下の3つの種類に分類し、各SQLの表現にGoの型を対応させることでSQLのミスを防止しています。
- Literal
- Expr
- Column
また、uuid.UUID
などの「その型自体がsql.Scannerを実装しており、pointerがdriver.Valuerを実装している型」をgenorm.ExprType
interfaceに入れることができます。
Literal
SQLでLiteralとして扱われる値です。
genorm.ExprType
interfaceに当てはまる型の値がLiteralにあたります。
bool
、int
、float32
などのgenorm.ExprType
interfaceに入れられないプリミティブ型の値はgenorm.Wrap
関数を用いてgenorm.WrappedPrimitive[T]
型とすることで、Literalとして扱えます。
Expr
SQLでexpressionとして扱う値です。
この値はExprを構成する中で使用したテーブルの型とExprが対応するgenorm.ExprType
interfaceに当てはまる型を型パラメーターとして持ちます。
例えば、genorm.EqLit(user.IDExpr, uuid.New())
の返り値はusersテーブルのidカラムを使用しており、SQLの中で真偽値となるため、*orm.UserTable
とbool
を型パラメーターとして持つExprとなります。
Joinを含まないテーブルのカラムは、users
テーブルのid
カラムであればusers.IDExpr
のように、テーブルに対応するpackage内の~Expr
という名前の変数を用いることでExpr
として使用できます。
Joinを含むテーブルのカラムは、users INNER JOIN messages ON users.id = messages.user_id
であれば、orm.MessageUserParseExpr(user.ID)
のように、テーブルに対応する~ParseExpr
という関数を使ってテーブルのExpr
に変換できます。
Column
SQLでカラム名として扱われる値です。
この値はカラムを含むテーブルに対応する型とExprが対応するgenorm.ExprType
interfaceに当てはまる型を型パラメーターとして持ちます。
Joinを含まないテーブルのカラムは、users
テーブルのid
カラムであればusers.ID
のように、テーブルに対応するpackage内の変数を用いることでColumn
として使用できます。
Joinを含むテーブルのカラムは、users INNER JOIN messages ON users.id = messages.user_id
であれば、orm.MessageUserParse(user.ID)
のように、テーブルに対応する~Parse
という関数を使ってテーブルのColumn
に変換できます。