私はプロジェクトでOpaleyeを使用して左結合を実行しようとしていますが、コードをコンパイルすることができません。Opaleyeでの左結合
まず:
data ModelA' a b = Model { primA :: a, foreignA :: b }
type ModelA = ModelA' UUID UUID
type ModelAColumn = ModelA' (Column PGUuid) (Column (Nullable PGUuid))
$(makeAdaptorAndInstance "pModelA" ''ModelA')
table :: Table ModelAColumn ModelAColumn
table = Opaleye.table "model_a" $ pModelA (ModelA (tableColumn "uuid") (tableColumn "foreign"))
も:私が関連付けられているテーブルを表す2つの "モデル" で始まる種類が反映するように
data ModelB' a b = Model { primB :: a, valB :: b }
type ModelB = ModelB' UUID String
type ModelBColumn = ModelB' (Column PGUuid) (Column PGText)
$(makeAdaptorAndInstance "pModelB" ''ModelB')
table :: Table ModelBColumn ModelBColumn
table = Opaleye.table "model_b" $ pModelB (ModelB (tableColumn "uuid") (tableColumn "val"))
、MODELAにはModelBを持つことはできませんが関連付けられています。
(ModelA、おそらくModelB)のペアを取得するためには、foreignA == primBのテーブル間の左結合によってクエリを取得する必要があります。
doJoin :: Connection -> IO [(ModelA, Maybe ModelB)]
doJoin conn = runQuery conn query
where
query :: Query (ModelAColumn, Maybe ModelBColumn)
query = leftJoin (queryTable ModelA.table) (queryTable ModelB.table) (\(ma, mb) -> foreignA ma .== primB mb)
しかし、これは動作しません。また、私は明示的に右の列のNULL値を許可するかどうかを述べるために、クエリ内の型シグネチャを置き換え特に複数のバリアント、試してみた:
query :: Query (ModelAColumn, (Column (Nullable PGUuid), Column (Nullable PGText))
をしかし、これはで失敗します。
ませインスタンスのData.Profunctor.Product.Default.Class.Default Opaleye.Internal.Join.NullMaker ModelBColumn(列(NULL可能 PGUuid)、列(NULL可能PGText)。私はこのクエリを行うことができますどのように
Opaleyeで?
あなたは 'を使用する必要がありますかJoin'モジュールを 'FunctionalJoin'に追加しましたか? –