簡體   English   中英

用Persistent和Esqueleto連接在sql中表示和類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM