Haskell持久查询

时间:2016-02-15 15:26:41

标签: sql haskell persist

我正在使用Persistent.Sqlite作为我的数据库IO,......我正在努力追随:

假设我有一个用户列表User:User_id和User_age,我想运行以下查询:

select * from User where (User_age * val_1) > val_2;

我尝试过使用* =。但该查询组合器仅允许用于更新类型。最有可能我可能需要使用rawSql?,..但是我不知道如何将值传递给查询。

1 个答案:

答案 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}}]