"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。
感谢您提出这个问题;否则我不会意识到有一个错误。
我是 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。
感谢您提出这个问题;否则我不会意识到有一个错误。