Mic*_*mas 13 haskell persistent yesod esqueleto
我一直试图找出一种合理的方法来使用持久性来表示SQL后端中的Haskell和类型.
我的目标Haskell数据类型是沿着的
data Widget = FooWidget Int | BarWidget T.Text
data HElement = HElement
{ name :: T.Text
, widget :: Widget
}
Run Code Online (Sandbox Code Playgroud)
我使用以下持久数据类型对它们进行建模:
Element
name T.Text
Foo
elementId ElementId
size Int
Bar
elementId ElementId
colour T.Text
Run Code Online (Sandbox Code Playgroud)
每个元素都只有Foo或Bar,而不是两者.
我想用a Left Outer Join
来选择我的所有元素和相应的Foo OR Bar.我的Esqueleto表达式是:
select $
from $ \(elem `LeftOuterJoin` foo `LeftOuterJoin` bar) -> do
on (just (elem ^. ElementId) ==. foo ?. FooElementId)
on (just (elem ^. ElementId) ==. bar ?. BarElementId)
return (elem, foo, bar)
Run Code Online (Sandbox Code Playgroud)
但是,当我执行代码时,我收到错误:
user error (Postgresql.withStmt': bad result status FatalError (("PGRES_FATAL_ERROR","ERROR: missing FROM-clause entry for table
Run Code Online (Sandbox Code Playgroud)
如果我删除第二个连接,则给出:
select $
from $ \(elem `LeftOuterJoin` foo) -> do
on (just (elem ^. ElementId) ==. foo ?. FooElementId)
return (elem, foo)
Run Code Online (Sandbox Code Playgroud)
代码运行没有错误.我确定这很明显,但我看不出我做错了什么.
编辑:我发现了问题所在; 来自文档:
请注意,ON子句的顺序是相反的!您需要以相反的顺序编写ons,因为这有助于可组合性(有关更多详细信息,请参阅on的文档).
以下代码有效(on
表达式的顺序颠倒过来):
select $
from $ \(elem `LeftOuterJoin` foo `LeftOuterJoin` bar) -> do
on (just (elem ^. ElementId) ==. bar ?. BarElementId)
on (just (elem ^. ElementId) ==. foo ?. FooElementId)
return (elem,foo,bar)
Run Code Online (Sandbox Code Playgroud)
谢谢,
迈克尔
按照 Waldheinz 的建议添加为答案
我发现了问题所在;来自文档:
请注意,ON 子句的顺序是相反的!您需要以相反的顺序编写 on,因为这有助于可组合性(有关更多详细信息,请参阅 on 的文档)。
以下代码有效(on
表达式的顺序相反):
select $
from $ \(elem `LeftOuterJoin` foo `LeftOuterJoin` bar) -> do
on (just (elem ^. ElementId) ==. bar ?. BarElementId)
on (just (elem ^. ElementId) ==. foo ?. FooElementId)
return (elem,foo,bar)
Run Code Online (Sandbox Code Playgroud)
问候,
迈克尔