我一直在尝试在项目中使用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"))
而且也:
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与相关。
我需要一个查询来获得由外部A == primB上的表之间的左连接给出的(ModelA,Maybe ModelB)对。我期待它看起来像:
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)
但这不起作用。我也试了多个变种,尤其是我在替换查询类型签名的权利,明确规定列的空性:
query :: Query (ModelAColumn, (Column (Nullable PGUuid), Column (Nullable PGText))
但这种失败:
没有实例Data.Profunctor.Product.Default.Class.Default Opaleye.Internal.Join.NullMaker ModelBColumn(栏(可空 PGUuid),柱(可空PGText)。
我怎样才能让这个查询在Opaleye?
你需要使用'通过'FunctionalJoin'连接''模块? –