2016-02-15 27 views
0

我使用Persistent.Sqlite我的数据库IO,......,我用以下挣扎:哈斯克尔坚持查询

可以说我有与列的表用户:USER_ID和User_age,我想运行以下查询:

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

我试过使用* =。但该查询组合器仅适用于更新类型。很可能我可能需要使用rawSql ?,但是我不确定如何将值传递给查询。

回答

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