我正在使用Persistent.Sqlite作为我的数据库IO,......我正在努力追随:
假设我有一个用户列表User:User_id和User_age,我想运行以下查询:
select * from User where (User_age * val_1) > val_2;
我尝试过使用* =。但该查询组合器仅允许用于更新类型。最有可能我可能需要使用rawSql?,..但是我不知道如何将值传递给查询。
答案 0 :(得分:2)
rawSql
为您提供原始力量!有了它你就可以做任何事情。在你的情况下,这应该工作:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
User
age Int
deriving Show
|]
getUser :: MonadIO m => ReaderT SqlBackend m [Entity User]
getUser = rawSql "select ?? from user where age * ? > ?" [PersistInt64 2, PersistInt64 40]
main :: IO ()
main = runSqlite "/home/sibi/test.db" $ do
runMigration migrateAll
johnId <- insert $ User 40
janeId <- insert $ User 41
users <- getUser
liftIO $ print (users :: [Entity User])
要了解有关特殊占位符?
和??
的详情,请阅读documentation here。我在那里添加了一个很好的例子来说清楚。如果您还有问题请告诉我。
以上代码将产生以下输出:
$ ./sqlitePersist
[Entity {entityKey = UserKey {unUserKey = SqlBackendKey {unSqlBackendKey = 1}}, entityVal = User {userAge = 40}},Entity {entityKey = UserKey {unUserKey = SqlBackendKey {unSqlBackendKey = 2}}, entityVal = User {userAge = 41}}]