我是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;
答案 0 :(得分:0)
原来这是由persistent-mysql
包中的错误导致的,该错误现已在persistent-mysql-2.3
修复。
以下是感兴趣的人的根本原因:
MySQL C库(以及扩展名为mysql
依赖的Haskell persistent-mysql
包)不区分类型级别的二进制文本数据和文本数据。因此,如果您将TEXT
值保存到数据库,那么当它被持久查找时,它似乎是二进制数据(PersistByteString
)。
通过检查列的字符集修复了#451,MySQL API文档建议将其作为适当的解决方案。
有关详情,请参阅拉取请求或this issue。
感谢您提出这个问题;我不会意识到还有一个错误。