[haskell] esqueleto에서 SQL 문자열을 생성하려면 어떻게해야합니까?

from명령문 에서 SQL 문자열을 생성하기 위해 esqueleto를 얻으려면 어떻게 해야합니까?

의 문서는 toRawSql“영구적 인 쿼리 로깅을 켜도됩니다”라고 말합니다. 내가 MonadLogger이해할 수있는 모든 가능한 형태를 시도했지만 SQL을 인쇄하지 않았습니다. 동일한 문서에 “이 기능을 수동으로 사용하는 것은 가능하지만 지루합니다”라고도 나와 있습니다. 그러나 유형의 생성 자나 유형의 값을 반환하는 함수 QueryType는 내보내지지 않습니다. 나는 그것이 QueryTypea 임을 알아 차리고 newtype사용 함으로써 이것을 피할 수 있었다 unsafeCoerce!

ConnectionSQL을 생성하기 위해 데이터베이스에 연결할 필요가 없더라도 (SQLite를 통해 얻은) 를 제공 해야했습니다.

이것이 내가 가진 것입니다. 더 나은 방법이 있어야합니다.

withSqliteConn ":memory:" $
    \conn -> return $ toRawSql SELECT
                               (unsafeCoerce ((const mempty)
                                  :: a -> Text.Lazy.Builder.Builder))
                               (conn, initialIdentState) myFromStatement)

http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html



답변

이 질문이 게시 된 이후 esqueleto로 많은 주요 수정을 거쳤습니다. 현재로 버전 2.1.2 및 여러 가지 이전 버전의 QueryType a사용자가 필요로 매개 변수 unsafeCoerce에서 제거되었습니다 toRawSql; 큰 사마귀는 더 이상 필요하지 않습니다.

현재 구현 된대로 a Connection가 필요합니다. 나는 유형의 동의어 이름으로 표시된 바와 같이, 믿고 IdentInfo, esqueleto쿼리에서 빌드 식별자에 이것을 사용합니다. 예를 들어 데이터베이스 이름을 추가 할 수 있습니다. 나는 소스를 충분히 깊이 연결하지 않았습니다. 가짜 연결을 전달 (예 :undefined 것은 작동하지 않습니다. 모의 연결이 구현 될 수 있는지 모르겠습니다. 솔루션이 실행 가능한 것 같습니다.

나머지 솔루션은 정상적으로 작동합니다. 때문에 toRawSql명시 적으로 내부 함수, API는 여기에 합리적인 것 같다. 다른 사람들은 연결 중립 문자열을 생성하는 것이 “가능해야한다”고 지적하지만 toRawSql.

MonadLogger권장대로 사용할 수 없다고 언급했습니다 . 무엇을 시도했고 무슨 일이 있었습니까?


답변