2016-02-15 25 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}}]