我一直在尋找持久庫來與sql數據庫接口。假設我有一個包含配方的數據庫,包含Recipe,Ingredient和RecIng表格。Haskell持久連接與Esqueleto
我(固然有限)的固定理解使我相信我應該這樣定義的表:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Recipe
title String
Ingredient
name String
RecIng
recId RecipeId
ingId IngredientId
quantity Int
|]
有了這個,就可以使用Esqueleto得到內這些表之間的連接:
select $
from $ \(i `InnerJoin ` ri `InnerJoin` r) -> do
on (r ^. RecipeId ==. ri ^. RecIngIngId)
on (i ^. IngredientId ==. ri ^. RegIngRecId)
return (r, ri, i)
這將返回(Recipe,RecIng,Ingredient)的元組。
我真正想要的是查詢導致以下食譜的方式:
data Recipe = Recipe { title :: String
, ingredients :: [Ingredient]
}
data Ingredient = Ingredient { name :: String
, quantity :: Integer
}
除了定義一組額外的數據類型,並且轉換的元組,是有這樣一個最佳實踐之類的事情?
就我所知,您需要手動在持久表示和自定義數據類型之間進行映射。這是一個鍋爐板,但在這種情況下,我有點喜歡它,你可以清楚地映射到數據庫中的內容,並且從中轉換到另一種類型是非常安全的:-)也可能有些情況下, t想要通過連接獲取數據。 –