我试图根据其他列更新表的一个列,但似乎无法使用updateWhere函数进行更新。因此,我尝试使用rawSQl,但由于类型错误,它无法工作。
getCalculateDeltaR :: personId -> Handler Html
getCalculateDeltaR personId = do
goods <- runDB $ selectList [GoodPerson ==. personId] []
forM goods $ \(Entity gid good) -> do
let aid = goodAsset good
asset <- runDB $ get404 aid
let mktValue = assetMktValue asset
runDB $ rawSql "UPDATE good SET delta = (? - orig_value) \
WHERE person = ? AND asset = ?"
[toPersistValue mktValue, toPersistValue personId, toPersistValue aid]
defaultLayout $ do
$(widgetFile "calculateDelta")我得到了以下错误,并尝试添加?在更新之后,但没有产生任何影响。
Ambiguous type variable `a0' in the constraint:
(RawSql a0) arising from a use of `rawSql'
Probable fix: add a type signature that fixes these type variable(s)
In the second argument of `($)', namely
`rawSql
...
...我可以传递给rawSQL的参数定义得很好,所以不确定是什么导致了这个问题。有人能告诉我如何解决上述问题吗?如果有更好的方法来更新基于其他列的列,那么也想知道这一点。
谢谢!
发布于 2013-08-02 02:07:53
我不太了解persistent,但这种类型错误的发生是因为您组合函数的方式是在不被检查的情况下生成一个消耗的值。例如,如果您有函数f :: a -> (Int, c)和g :: (Int, c) -> b,那么g . f觉得它应该具有a -> b类型,但实际上这是一个错误,因为GHC不知道c应该是什么。
解决这个问题的方法是检查(Int, c)值,这样就可以将c解析成特定的类型。这通常是通过手动类型注释或使用asTypeOf来完成的。
https://stackoverflow.com/questions/18007484
复制相似问题