Haskell:坚持.唯一的选择



我正在尝试使用持久化。sqlite查询我的数据库,…但是到目前为止,在我找到的所有教程中,首先我必须迁移和插入数据。只有在那之后才会有选择。

但是如果我只想在现有数据上做选择呢?之前没有迁移和插入吗?

例如在下面的代码中。如果我想跳过buildDb(目前这将不起作用)?

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies #-}
{-# LANGUAGE OverloadedStrings, GADTs, FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module DBio where
import Data.Text (Text)
import Database.Persist
import Database.Persist.Sqlite (runSqlite, runMigrationSilent)
import Database.Persist.TH (mkPersist, mkMigrate, persistLowerCase,
       share, sqlSettings)
import Database.Persist.Sql (insert)
import Data.Conduit (($$))
import Data.Conduit.List as CL
import Control.Monad.IO.Class (liftIO)

share [mkPersist sqlSettings, mkMigrate "migrateTables"] [persistLowerCase|
Tutorial
   value    Double
   url      Text
   school   Bool
   deriving Show
|]

run :: IO ()
run = runSqlite "../DB/mind.sqlite" $ do
   buildDb
   basic <- selectList [TutorialValue >. 0.0] []
   liftIO $ print basic
buildDb = do
   --runMigrationSilent migrateTables
   insert $ Tutorial 2.22 "https://fpcomplete.com/school/basic-haskell-1" True

例如,如果我注释buildDb,表一旦创建后,我得到以下错误:

No instance for (Control.Monad.IO.Class.MonadIO m0)
  arising from a use of ‘insert’
The type variable ‘m0’ is ambiguous
Relevant bindings include
  buildDb :: Control.Monad.Trans.Reader.ReaderT
               persistent-2.2:Database.Persist.Sql.Types.SqlBackend
               m0
               (Key Tutorial)
    (bound at DBio.hs:35:1)
Note: there are several potential instances:
  instance Control.Monad.IO.Class.MonadIO m =>
           Control.Monad.IO.Class.MonadIO
             (conduit-1.2.5:Data.Conduit.Internal.Conduit.ConduitM i o m)
    -- Defined in ‘conduit-1.2.5:Data.Conduit.Internal.Conduit’
  instance Control.Monad.IO.Class.MonadIO m =>
           Control.Monad.IO.Class.MonadIO
             (conduit-1.2.5:Data.Conduit.Internal.Pipe.Pipe l i o u m)
    -- Defined in ‘conduit-1.2.5:Data.Conduit.Internal.Pipe’
  instance Control.Monad.IO.Class.MonadIO IO
    -- Defined in ‘Control.Monad.IO.Class’
  ...plus 16 others
In the expression: insert
In a stmt of a 'do' block:
  insert
  $ Tutorial
      2.22 "https://fpcomplete.com/school/basic-haskell-1" True
In the expression:
  do { insert
       $ Tutorial
           2.22 "https://fpcomplete.com/school/basic-haskell-1" True }

我设法得到一个工作示例。我猜上面的问题是关于导入模块的。

{-# LANGUAGE OverloadedStrings, GADTs, TypeFamilies #-}
{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses, GeneralizedNewtypeDeriving #-}
import Database.Persist ((>.), insertMany, Entity(..))
import Database.Persist.Sqlite (runSqlite,runMigration)
import qualified Database.Persist.TH as TH (share, mkPersist, sqlSettings, 
   mkMigrate, persistLowerCase)
import Control.Monad (mapM_)
import Database.Persist (selectList, entityVal)
import Database.Persist.Sqlite (runSqlite)
import Control.Monad.IO.Class  (liftIO)

TH.share [TH.mkPersist TH.sqlSettings, TH.mkMigrate "migrateAll"] [TH.persistLowerCase|
MyRecord
  value Int
  deriving Show
|]
create :: IO ()
create = runSqlite "test.sqlite" $ do
  let n = 10
  runMigration migrateAll
  insertMany $ map MyRecord [1..n]
  return ()
get :: IO ()
get = runSqlite "test.sqlite" $ do
   records <- selectList [MyRecordValue >. 9] []
   liftIO $ print records

最新更新