"Not a PersistText value" 是什么意思?

what does "Not a PersistText value" mean?

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

[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)

这到底是什么意思?如果我查看数据库,它会正确存储所有 post。为什么无法从数据库加载 posts?

这是代码

型号

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(从数据库获取 post 并显示)

module Handler.PostDetails where

import Import

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

PostNew.hs(创建一个新的post并将其存储在数据库中,插入后,它使用新的post重定向到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")

我不明白为什么编译器没有捕获到这个错误。当我创建 post 时,我使用 "Internal Server Error"

而不是标题

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

对于那些感兴趣的人来说,这是根本原因:

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

这已在 #451 中通过检查列的字符集得到修复,MySQL API 文档将其推荐为合适的解决方案。

有关更多详细信息,请参阅拉取请求或 this issue

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