Я пытаюсь обновить столбец таблицы на основе других столбцов, но похоже, что я не могу сделать это с помощью функции updateWhere. Поэтому я попытался использовать rawSQl, но он не работает из-за неоднозначной ошибки типа.Ошибка неоднозначного типа при использовании RawSql Update
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")
Я получаю следующее сообщение об ошибке, и я попробовал добавить ?? после UPDATE, но это не изменило ситуацию.
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, четко определены, поэтому не уверены, что вызывает эту проблему. Может ли кто-нибудь сказать мне, как я должен решить вышеупомянутую проблему? Если есть лучший способ обновить столбцы на основе других столбцов, хотелось бы узнать об этом.
Спасибо!
это потрясающе! Спасибо за предложение. Добавив :: Handler [Entity Good] в конец моего оператора rawSql, исправлена ошибка. Я не знаю, что UPDATE будет точно возвращать, но похоже, что тип таблицы удовлетворяет компилятору, так как меня не волнуют какие-либо возвращаемые значения. – Ecognium