2013-05-13 4 views
4

내 Yesod 응용 프로그램에서 웹 이외의 서비스를 포크하려고하고 있는데 데이터베이스와 어떤 상호 작용이 필요합니다. this 포스트에서 나는 makeApplication에 서비스를 넣기로 결정했다. 내 서비스가 특정 일이 발생하고 데이터베이스에 저장 될 때 어떤 가치를 반환하고 싶습니다. 따라서이 작업을 수행하는 가장 좋은 방법이 무엇인지 궁금합니다.makeApplication 함수 내에서 데이터베이스를 쿼리하는 방법

runDB $ insert $ Stuff (T.pack "stuff")을 makeApplication 함수 안에서 어떻게 실행합니까?

편집 :

runDBIO conf foundation $ do 
    dbid <- insert $ Stuff (T.pack "some random stuff") 
    string <- get dbid 
    liftIO $ print string 

그러나, 난 마이클에 의해 제안 나는 내가 그렇게처럼 사용 Application.hs

runDBIO conf foundation f = do 
    dbconf <- withYamlEnvironment "config/postgresql.yml" (appEnv conf) 
     Database.Persist.loadConfig >>= 
     Database.Persist.applyEnv 
    p <- Database.Persist.createPoolConfig (dbconf :: Settings.PersistConf) 
    logger <- mkLogger True stdout 

    runLoggingT 
     (Database.Persist.runPool dbconf f p) 
     (messageLoggerSource foundation logger) 

내부와 makeApplication에 다음 도우미 함수를 만든 이 컴파일 오류가 발생합니다 :

No instance for (resourcet-0.4.5:Control.Monad.Trans.Resource.MonadResource IO) 
arising from a use of 'insert' 

잘못 입력 했습니까? runPool을위한 e? 또는 insert에 대한 인스턴스를 만들어야합니까? runMigration migrateAll이 작동하는 이유는 알 수 없지만 insert은 그렇지 않습니다.

답변

2

IO 모나드에서 데이터베이스 작업을 실행하는 방법에 대한 데모를 the scaffolding itself에 볼 수 있습니다. 본질적으로 두 가지 정보, 즉 쿼리를 기록하는 방법과 데이터베이스 연결 풀을 제공해야합니다. 해당 코드를 도우미 함수 (예 : runDBIO)로 분해 한 다음 runDBIO $ insert $ Stuff $ T.pack "stuff"을 실행할 수 있습니다.

+0

멋지다. 시도해 보자. 질문, 도우미 기능에 대한 당신의 입장은 무엇입니까? 나는 항상 그것이 반 패턴이라고 생각했다. – HHC

+0

헬퍼 함수에 대한 우리의 정의가 다를 수도 있습니다. 나는 단지 일반적인 코드를 제외시키는 기능을 의미했는데, 분명히 반 패턴을 고려하지 않았을 것이다. –

+0

예 일반적인 코드라면 함수를 만드는 것이 합리적입니다. 어쩌면 도우미 함수에 대한 의미는 자바와 같고, 사람들은 유틸리티 클래스를 만들고 관련없는 많은 함수를 같은 클래스에 넣을 수 있습니다. – HHC