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


86

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


2
연결을 제공해야하는 이유는 데이터베이스에서 다형성이 있고 추론 된 SqlPersist인스턴스를 사용하여 데이터베이스 별 SQL 문자열을 생성 하기 때문이라고 생각합니다 .
Thomas

2
그러나 연결 및 기본 데이터베이스 유형은 다릅니다. 순수하게 SQL 문자열을 생성 할 수 있어야합니다.
Tom Ellis

답변:


2

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

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

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

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


MonadLogger안타깝게도 무엇을 시도했는지 기억이 나지 않습니다 . 꽤 오래 전이었습니다.
Tom Ellis

toRawSql지금이 질문의 유스 케이스에서 작동하는지 확인하기 위해 편리한 테스트 프로젝트가 있습니까? esqueleto시험해 볼 환경을 설정 했지만 persistent실제 쿼리를 실제로 구성하고 소비 할 다른 모든 기계를 파악할 시간이 없었습니다 .
Christian Conkle 2014

나는 어떤 종류의 테스트 환경이나 esqueleto 프로젝트가 전혀 없습니다. 죄송합니다.
Tom Ellis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.