Haskell 坚持查询
Haskell Persist query
我正在为我的数据库 IO 使用 Persistent.Sqlite,...我正在努力解决以下问题:
假设我有一个 table 用户,其列为:User_id 和 User_age,我想 运行 以下查询:
select * from User where (User_age * val_1) > val_2;
我试过使用*=。但该查询组合器只允许用于更新类型。很可能我可能需要使用 rawSql?,..但是我不确定如何将值传递给查询。
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}}]
我正在为我的数据库 IO 使用 Persistent.Sqlite,...我正在努力解决以下问题:
假设我有一个 table 用户,其列为:User_id 和 User_age,我想 运行 以下查询:
select * from User where (User_age * val_1) > val_2;
我试过使用*=。但该查询组合器只允许用于更新类型。很可能我可能需要使用 rawSql?,..但是我不确定如何将值传递给查询。
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}}]