2017-04-02 5 views
2

다음과 같은 오류가 발생할 수 있습니까?YesCode + sqlite3에서 ErrorConstraint SqliteException 오류가 발생할 수 있습니까?

uncaught exception: SqliteException (SQLite3 returned ErrorConstraint while attempting to perform step.) 

이상한 점은 대부분의 사양이 withApp을 사용하는이 오류로 실패한다는 것입니다.

경우, 그러나, 나는

system "rm project-name_test.sqlite3*" 

가 갑자기 모든 사양을 다시 통과 할 TestImport.hswipeDB을 수정합니다. 테스트 실행에는 약 4-5 배의 시간이 걸리지 만 이상적인 것은 아닙니다.

wipeDB 로직 (stack new에 의해 생성됨)이 충분하지 않을 수 있습니까?

models 파일에서 고유성 제약 조건을 지정했는지 알기 위해 파일을 살펴 보았지만 아무 것도 보이지 않습니다. 그들은 제약이있는 경우

User 
    emailAddress Text 
    password ByteString 
    verified Bool 
    verifyKey Text 
    resetPasswordKey Text 
    deriving Show 

Foo 
    userA UserId 
    userB UserId 
    deriving Show 

, 그들은이 파일에있을 것입니다하지 않을 :

나는 제외하고 models에서 모든 댓글을 달았습니다? 또는 제약 조건을 선언하는 다른 장소가있을 수 있습니까? 어쨌든 예외가 참조 할 수있는 제약 조건은 무엇입니까?

필자가 원하는만큼 줄이지는 않았지만,이 모든 내용은 runDB $ insert $ Foo으로 거슬러 올라갈 수 있습니다. 제거하면 해당 예외는 사라졌고 훨씬 더 많은 사양이 통과되었습니다 , 삽입이 일어날 것으로 예상하기 때문에 몇 가지 실패 만 있습니다. 그리고 그들은 ErrorConstraint 예외가 아니라 어설 션 실패로도 실패합니다.

이 오류에 대해 가능한 여러 가지 이유가있는 경우 예외보다 더 모호하다는 것을 알고 싶습니다.

+1

:

그래서이 지금 내 wipeDB 기능입니다 https://github.com/yesodweb/persistent/issues/675 – Wizek

답변

2

This은 내가 찾은 최고의 해결책입니다. 그러면 "공식적인"해결책이 될 것입니다.

그래서 내 프로젝트에서는 this way을 완료했습니다. 내가 여기에 대한 문제를 열었습니다

wipeDB :: App -> IO() 
wipeDB app = do 
    let settings = appSettings app 
     logFunc = messageLoggerSource app (appLogger app) 

    sqliteConn <- rawConnection (sqlDatabase $ appDatabaseConf settings) 
    let infoNoFK = set fkEnabled False $ mkSqliteConnectionInfo "" 
     wrapper = wrapConnectionInfo infoNoFK sqliteConn 
    pool <- runLoggingT (createSqlPool wrapper 1) logFunc 

    flip runSqlPersistMPool pool $ do 
     tables <- getTables 
     sqlBackend <- ask 
     let queries = map (\t -> "DELETE FROM " ++ (connEscapeName sqlBackend $ DBName t)) tables 
     forM_ queries (\q -> rawExecute q [])