[英]Representing sum types in sql with Persistent, and Esqueleto joins
我一直試圖找出一種合理的方法來使用持久性來表示SQL后端中的Haskell和類型。
我的目標Haskell數據類型是沿着的
data Widget = FooWidget Int | BarWidget T.Text
data HElement = HElement
{ name :: T.Text
, widget :: Widget
}
我使用以下持久數據類型對它們進行建模:
Element
name T.Text
Foo
elementId ElementId
size Int
Bar
elementId ElementId
colour T.Text
每個元素都只有Foo或Bar,而不是兩者。
我想使用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)
但是,當我執行代碼時,我收到錯誤:
user error (Postgresql.withStmt': bad result status FatalError (("PGRES_FATAL_ERROR","ERROR: missing FROM-clause entry for table
如果我刪除第二個連接,則給出:
select $
from $ \(elem `LeftOuterJoin` foo) -> do
on (just (elem ^. ElementId) ==. foo ?. FooElementId)
return (elem, foo)
代碼運行沒有錯誤。 我確定這很明顯,但我看不出我做錯了什么。
編輯:我發現了問題所在; 來自文檔:
請注意,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)
謝謝,
邁克爾
根據Waldheinz的建議添加答案
我發現了問題所在; 來自文檔:
請注意,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)
問候,
邁克爾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.