내 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
은 그렇지 않습니다.
멋지다. 시도해 보자. 질문, 도우미 기능에 대한 당신의 입장은 무엇입니까? 나는 항상 그것이 반 패턴이라고 생각했다. – HHC
헬퍼 함수에 대한 우리의 정의가 다를 수도 있습니다. 나는 단지 일반적인 코드를 제외시키는 기능을 의미했는데, 분명히 반 패턴을 고려하지 않았을 것이다. –
예 일반적인 코드라면 함수를 만드는 것이 합리적입니다. 어쩌면 도우미 함수에 대한 의미는 자바와 같고, 사람들은 유틸리티 클래스를 만들고 관련없는 많은 함수를 같은 클래스에 넣을 수 있습니다. – HHC