Haskell 是的,删除级联
根据一个Haskell 是的,删除级联,haskell,yesod,Haskell,Yesod,根据一个DeleteCascadetypeclass是几年前添加的。我只能假设这是为了添加到模型中。按照以下方式设置我的模型配置后: Field ... foreignId ForeignId DeleteCascade 我的应用程序编译得很好。但是DB模式不变,并且应用程序也不会级联删除。我应该(发抖)手动操作吗?有更好的办法吗 我使用YESod脚手架(Apple .Hask.Huff.Health.Health.St.SHS,…)为了利用DeleTeCaseDad,需要使用
DeleteCascade
typeclass是几年前添加的。我只能假设这是为了添加到模型中。按照以下方式设置我的模型配置后:
Field
...
foreignId ForeignId DeleteCascade
我的应用程序编译得很好。但是DB模式不变,并且应用程序也不会级联删除。我应该(发抖)手动操作吗?有更好的办法吗
我使用YESod脚手架(Apple .Hask.Huff.Health.Health.St.SHS,…)
为了利用DeleTeCaseDad,需要使用DeleTasCaseDead或DeleCasCADeDead函数。只有当您的类型有可用的DeleteCascade实例时,这些才起作用。获取这些信息的最简单方法是使用mkDeleteCascade函数。
使用现有答案,我花了一些时间才弄清楚如何使用deleteCascade。作为Yesod的初学者,我对Yesod没有一个概述 要获得有效的删除级联,您不需要更改模型中的任何内容。假设您的实体文件如下所示,您希望删除条目
Entry
title Text
Comment
entry EntryId
您不必更改此实体文件
通常在Model.hs
中引导实体的代码如下所示
share [ mkPersist sqlOnlySettings
, mkMigrate "migrateAll" ]
$(persistFileWith lowerCaseSettings "config/models")
添加mkDeleteCascade以获取实体的DeleteCascades实例
share [ mkPersist sqlOnlySettings
, mkDeleteCascade sqlOnlySettings
, mkMigrate "migrateAll" ]
$(persistFileWith lowerCaseSettings "config/models")
一旦您想要删除条目,例如在postDeleteEntryR
处理程序中,您必须使用deleteCascade
或deleteCascade,而不是delete
runDB $ deleteCascade entryId
使用delete
的效果与以前相同。谢谢您的回答。你能把范围扩大一点吗?我的问题是:普通用户不需要使用mkDeleteCascade。表示该文件仅供内部使用。我在deleteCascade上也找不到任何有用的文档。你能给我举一个简单的例子吗?关于内部使用或普通用户的评论不是应用于函数本身,而是应用于模块。您链接到的那些模块都由其他模块重新导出(例如,Yesod.Persist)。使用这些函数没有问题。不幸的是,我没有一个完整的例子。