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