gpt4 book ai didi

haskell - 在 Yesod Persist 模型中存储 Markdown

转载 作者:行者123 更新时间:2023-12-02 03:23:11 24 4
gpt4 key购买 nike

我正在尝试将 Markdown 存储在具有 MySQL 后端的持久模型的字段中。我已将用例分解为:

模型:

TestModel
content Markdown

模型.hs:

import Text.Markdown (Markdown)
import Yesod.Text.Markdown ()
....

这似乎创建了正确的迁移:

mysql> show columns in test_model;
+---------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| content | text | NO | | NULL | |
+---------+------------+------+-----+---------+----------------+

但是,当我尝试从此表中检索数据时,出现异常。下面的示例来自 cabal repl,但在应用程序运行时也会发生同样的情况:

repl> testid <- db $ insert $ TestModel $ Markdown "# Hello world"
[Debug#SQL] INSERT INTO `test_model`(`content`) VALUES(?); [PersistText "# Hello world"]
repl> testmodel <- db $ get testid
[Debug#SQL] SELECT `content` FROM `test_model` WHERE `id`=?; [PersistInt64 2]
*** Exception: runFakeHandler issue: InternalError "get TestModelKey {unTestModelKey = SqlBackendKey {unSqlBackendKey = 2}}: field content: Not a PersistText value"

我的第一个猜测是 TestModel 构造函数的值是错误的,但即使在表单中使用 markdownField 创建对象时也会出现同样的错误:

testModelForm :: AForm Handler TestModel
testModelForm = TestModel
<$> areq markdownField "Content" Nothing

getTestModelR :: TestModelId -> Handler Html
getTestModelR testModelId = do
testmodel <- runDB $ get404 testModelId
....
08/Aug/2015:12:44:33 -0700 [Error#yesod-core] get TestModelKey {unTestModelKey = SqlBackendKey {unSqlBackendKey = 2}}: field content: Not a PersistText value @(yesod-core-1.4.12:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:577:5)

有没有人以前见过这个异常并且知道如何处理它?我似乎能找到的关于此错误的唯一文档是 source code对于 yesod-text-markdown

最佳答案

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

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

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

我在 #451 中修复了这个问题通过检查列的字符集,MySQL API 文档推荐将其作为合适的解决方案。

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

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

关于haskell - 在 Yesod Persist 模型中存储 Markdown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31898691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com