持久性无法将预期类型“键表”与实际类型文本匹配

Posted

技术标签:

【中文标题】持久性无法将预期类型“键表”与实际类型文本匹配【英文标题】:Persistent Couldn't match expected type ‘Key table’ with actual type Text 【发布时间】:2015-05-05 07:02:22 【问题描述】:

我不知道这对你来说确实是个问题,但对我来说这是个大问题。 我在 html 中创建了一个表单,其中一个字段将保存城市列表(它是一个选择标记),因此选项的值包含 city_id

在我的 post 处理程序中,它看起来像这样:

 postPriceR :: Handler Html
 postPriceR = do
    now <- liftIO getCurrentTime
    city <- runInputPost $ ireq textField "city"
    amount <- runInputPost $ ireq textField "amount"
    runDB $ insert $ Prices city 100.0 now Nothing
    redirect PriceR

这也将帮助您: 我的模特:

Prices
    cityId CitiesId
    amount Double
    createdOn UTCTime default=now()
    updatedOn UTCTime Maybe
    deriving Show Generic
Cities
    stateId StatesId
    name Text
    createdOn UTCTime default=now()
    updatedOn UTCTime Maybe
    deriving Show Generic

并给我这个警告:

 Couldn't match expected type ‘Key Cities’ with actual type Text …

希望你能帮助我。谢谢。

【问题讨论】:

问题在于persistent 不知道如何将Text 转换为您的数据库密钥——假设您有某种SQL 存储,通常的解决方案是使用toSqlKey @BitTickler 看这里只是 OT - 如果你对 yesod 中的函数命名有疑问,你应该去他们的 github 页面并在那里打开一个问题 - 这里你只是 拖钓 @CarstenKönig - 你能给我一个sn-p吗?谢谢 这有点棘手,因为我无法编译/检查您的代码 - 但在 runDB $ insert $ Prices city ... 中的 city 您应该能够像在 let city' = toSqlKey . read . unpack $ city 中一样使用 city' - 您可能需要导入toSqlKeyunpack 或者最好使用intField,然后你可以删除read . unpack的东西! 【参考方案1】:

我使用@CarstenKönig 帮助解决了这个问题。使用toSqlKey

这里是:

import Data.Int

runDB $ insert $ Prices (toSqlKey (read (unpack city) :: Int64 ) ) 100.0 now Nothing

感谢大家的帮助。

【讨论】:

左右 ;) - 我很好

以上是关于持久性无法将预期类型“键表”与实际类型文本匹配的主要内容,如果未能解决你的问题,请参考以下文章

Haskell类型错误 - 无法将预期类型“a”与实际类型“RE a”匹配

将 SwiftUI 中的文本与背景属性相结合会产生错误,因为无法将“某些视图”类型的值转换为预期的参数类型“文本”?

Fay 代码中的持久模型类型

XPages 进度条在服务器页面持久性设置“将页面保留在内存中”时无法按预期工作

ECS 与 EFS 或 EBS 上的持久数据与 CloudFormation

在 esqueleto 中加入视图