什么"不是PersistText值"意思?

时间:2015-08-09 07:48:26

标签: mysql haskell mariadb yesod

我是yesod的新手,我试图通过此截屏视频制作相同的博客项目:https://www.youtube.com/watch?v=SadfV-qbVg8唯一不同的是我使用的是MariaDB而不是PostgreSQL。每次我添加新的博客帖子并重定向到显示它的页面时,我都会看到此错误:

[Error#yesod-core] get BlogPostKey {unBlogPostKey = SqlBackendKey {unSqlBackendKey = 5}}: field article: Not a PersistText value @(yesod-core-1.4.12:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:577:5)

究竟是什么意思?如果我查看数据库,它会正确存储所有帖子。为什么无法从数据库加载帖子?

这是代码

模型

User
    ident Text
    password Text Maybe
    UniqueUser ident
    deriving Typeable
Email
    email Text
    user UserId Maybe
    verkey Text Maybe
    UniqueEmail email

BlogPost
    title Text
    article Markdown

PostDetails.hs(从DB获取帖子并显示它)

module Handler.PostDetails where

import Import

getPostDetailsR :: BlogPostId -> Handler Html
getPostDetailsR blogPostId = do     
    blogPost <- runDB $ get404 blogPostId 
    defaultLayout $ do
    $(widgetFile "postDetails/post")

PostNew.hs(创建一个新帖子并将其存储在数据库中,插入后,用新帖子重定向到PostDetails.hs)

module Handler.PostNew where

import Import
import Yesod.Form.Bootstrap3
import Yesod.Text.Markdown

blogPostForm :: AForm Handler BlogPost
blogPostForm = BlogPost 
            <$> areq textField (bfs ("Title" :: Text)) Nothing
            <*> areq markdownField (bfs ("Article" :: Text)) Nothing

getPostNewR :: Handler Html
getPostNewR = do
    (widget, enctype) <- generateFormPost $ renderBootstrap3 BootstrapBasicForm blogPostForm
    defaultLayout $ do
        $(widgetFile "posts/new")

postPostNewR :: Handler Html
postPostNewR = do
    ((res, widget), enctype) <- runFormPost $ renderBootstrap3 BootstrapBasicForm blogPostForm
    case res of
     FormSuccess blogPost -> do
        blogPostId <- runDB $ insert blogPost
        redirect $ PostDetailsR blogPostId
     _ -> defaultLayout $(widgetFile "posts/new")

我不明白为什么编译器没有捕获到这个错误。当我创建帖子时,而不是标题我是&#34;内部服务器错误&#34;

1 个答案:

答案 0 :(得分:0)

原来这是由persistent-mysql包中的错误导致的,该错误现已在persistent-mysql-2.3修复。

以下是感兴趣的人的根本原​​因:

MySQL C库(以及扩展名为mysql依赖的Haskell persistent-mysql包)不区分类型级别的二进制文本数据和文本数据。因此,如果您将TEXT值保存到数据库,那么当它被持久查找时,它似乎是二进制数据(PersistByteString)。

通过检查列的字符集修复了#451,MySQL API文档建议将其作为适当的解决方案。

有关详情,请参阅拉取请求或this issue

感谢您提出这个问题;我不会意识到还有一个错误。