Задавая ghci :info User
дал мне правильный совет: он показывает свои экземпляры классов. Оказывается, неправильно использовать Entity User
напрямую. Я подозреваю, что, хотя это создает сущность, все экземпляры класса, сгенерированные Database.Persist.TH.share
, отсутствуют в нем. Следующий код компилируется, также удалив избыточное ограничение, как упомянуто Bjartur:
sampleUser :: User
sampleUser = User
{ userName = "admin"
, userEmail = "admin@test.com"
}
type U = User
connectInfo :: MySQLConnectInfo
connectInfo = undefined
runAction :: (MonadUnliftIO m, IsPersistBackend r, BaseBackend r ~ SqlBackend) => MySQLConnectInfo -> ReaderT r (LoggingT m) a -> m a
runAction connectInfo action = runStdoutLoggingT $ withMySQLConn connectInfo $ \backend ->
runReaderT action backend
insertUser :: (PersistRecordBackend U SqlBackend) =>
U -> ReaderT SqlBackend (LoggingT IO) (Key U)
insertUser = insert
doDBStuff :: IO ()
doDBStuff = do
runAction connectInfo (runMigration migrateAll)
runAction connectInfo (insertUser sampleUser) -- compile error fixed
return ()