Got a working example of cascading delete but it requires a select followed by a delete

This commit is contained in:
Fintan Halpenny 2017-07-23 23:49:34 +01:00
parent 9fc64131b0
commit de2d9f8a0b

View File

@ -5,6 +5,7 @@
{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeFamilies #-}
@ -17,6 +18,7 @@ module Main
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
import Blog import Blog
import Control.Monad (void) import Control.Monad (void)
import Control.Monad (forM_)
import Control.Monad.IO.Class (MonadIO, liftIO) import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Logger (MonadLogger) import Control.Monad.Logger (MonadLogger)
import Control.Monad.Reader (MonadReader (..), runReaderT) import Control.Monad.Reader (MonadReader (..), runReaderT)
@ -31,7 +33,9 @@ import Database.Persist.TH (mkDeleteCascade, mkMigrate,
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
share [mkPersist sqlSettings, mkDeleteCascade sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| share [ mkPersist sqlSettings
, mkDeleteCascade sqlSettings
, mkMigrate "migrateAll"] [persistLowerCase|
Person Person
name String name String
age Int Maybe age Int Maybe
@ -136,12 +140,18 @@ updateJoao =
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
deleteYoungsters :: (MonadIO m, MonadLogger m) deleteYoungsters :: (MonadIO m, MonadLogger m)
=> SqlWriteT m () => SqlPersistT m ()
deleteYoungsters = do deleteYoungsters = do
-- | Delete any persons under the age of 14 -- | Delete any persons under the age of 14
delete $
-- | In this case where `ON DELETE CASCADE` is not generated by migration
-- | we select all the entities we want to delete and then for each one
-- | one we extract the key and use Persistent's `deleteCascade`
youngsters <- select $
from $ \p -> do from $ \p -> do
where_ (p ^. PersonAge <. just (val 14)) where_ (p ^. PersonAge <. just (val 14))
pure p
forM_ youngsters (deleteCascade . entityKey)
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -198,7 +208,6 @@ cleanDb = do
where where
dropTable tableName = rawExecute ("DROP TABLE " <> tableName) [] dropTable tableName = rawExecute ("DROP TABLE " <> tableName) []
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
main :: IO () main :: IO ()
main = do main = do
@ -229,4 +238,4 @@ main = do
where where
say :: (MonadIO m, Show a) => a -> m () say :: (MonadIO m, Show a) => a -> m ()
say = liftIO . print say = liftIO . print
connection = "host=localhost port=5433 user=postgres dbname=esqueleto_blog_example password=Leon93" connection = "host=localhost port=5433 user=postgres dbname=esqueleto_blog_example password=***"