我一直在寻找持久库来与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想要通过连接获取数据。 –