持久性无法将预期类型“键表”与实际类型文本匹配
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'
- 您可能需要导入toSqlKey
和 unpack
或者最好使用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 中的文本与背景属性相结合会产生错误,因为无法将“某些视图”类型的值转换为预期的参数类型“文本”?
XPages 进度条在服务器页面持久性设置“将页面保留在内存中”时无法按预期工作