【发布时间】:2015-03-23 23:56:59
【问题描述】:
我能找到的所有关于 Persistent 的教程和参考资料都非常详细地描述了 Persistent 如何从其 DSL 中的单个定义中自动创建新的数据类型、模式、迁移等。但是,我找不到关于如何让 Persistent 处理已经存在的数据类型的解释。
一个例子:假设我已经有一个用于某些游戏逻辑的 Haskell 模块。它包括玩家的记录类型。 (它意味着通过镜头使用,因此有下划线。)
data Player = Player { _name :: String
, _points :: Int
-- more fields ...
}
$(makeLenses ''Player)
问题:使用 Persistent 将这种类型存储在数据库中的规范方法是什么?是否有一些我可以实现的类型类。还是我最好通过 Persistent 定义一个新类型,例如
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
PlayerEntry
name Text
points Int
|]
然后在这些类型之间手动映射?
playerToEntry :: Player -> PlayerEntry
playerToEntry pl = PlayerEntry (pl^.name) (pl^.points)
entryToPlayer :: PlayerEntry -> Player
entryToPlayer e = Player (name e) (points e)
【问题讨论】:
-
你认为手动定义像this这样的字段有意义吗?
-
@ace 当然,您可以手动生成
mkPersist为您生成的所有代码。我最初发布了这个问题,因为我没有找到一个地方可以很好地记录如何做到这一点。但是,事实证明我实际上需要在表格中添加额外的列。因此,在我的案例中,两种类型之间的编组被证明是一个很好的解决方案。
标签: haskell yesod persistent