Làm cách nào tôi có thể lấy esqueleto để tạo chuỗi SQL cho tôi?


86

Làm cách nào tôi có thể lấy esqueleto để tạo chuỗi SQL từ một fromcâu lệnh?

Tài liệu của toRawSqlnói rằng "bạn chỉ có thể bật ghi nhật ký truy vấn của liên tục". Tôi đã thử tất cả các dạng có thể MonadLoggermà tôi có thể hiểu được, nhưng nó không bao giờ in ra bất kỳ SQL nào. Tài liệu tương tự cũng nói rằng "sử dụng chức năng này theo cách thủ công ... là có thể nhưng tẻ nhạt". Tuy nhiên, không có hàm tạo nào của kiểu hoặc bất kỳ hàm nào trả về giá trị của kiểu QueryTypeđược xuất. Tôi đã xoay sở để vượt qua điều này bằng cách nhận thấy đó QueryTypelà một newtypevà sử dụng unsafeCoerce!

Tôi cũng buộc phải cung cấp một Connection(mà tôi nhận được qua SQLite) mặc dù không cần phải kết nối với cơ sở dữ liệu để tạo SQL.

Đây là những gì tôi có. Phải có cách tốt hơn.

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
Tôi tin rằng lý do bạn cần cung cấp cho nó một kết nối là bởi vì nó đa hình trên cơ sở dữ liệu và sử dụng các SqlPersistphiên bản được suy luận để tạo các chuỗi SQL cụ thể cho datasbase.
Thomas

2
Tuy nhiên, kết nối và loại cơ sở dữ liệu cơ bản là những thứ khác nhau. Có thể hoàn toàn tạo chuỗi SQL.
Tom Ellis

Câu trả lời:


2

Trong thời gian kể từ khi câu hỏi này được đăng, esqueletođã trải qua một số sửa đổi lớn. Kể từ phiên bản 2.1.2 và một số phiên bản trước đó, QueryType athông số cần thiết của bạn unsafeCoerceđã bị xóa toRawSql; mụn cóc lớn không cần thiết nữa.

Như được triển khai hiện tại, a Connectionlà bắt buộc. Tôi tin rằng, như được chỉ ra bởi tên từ đồng nghĩa của loại IdentInfo, esqueletosử dụng tên này để tạo số nhận dạng trong truy vấn. Ví dụ, nó có thể thêm tên cơ sở dữ liệu. Tôi đã không thực sự giảm nguồn đủ sâu. Chỉ cần nói rằng, việc chuyển một kết nối giả (tức là undefined) không hoạt động; Tôi không biết liệu một kết nối giả có thể được triển khai hay không. Giải pháp của bạn có vẻ khả thi.

Phần còn lại của giải pháp của bạn sẽ hoạt động tốt. Vì toRawSqlrõ ràng là một chức năng nội bộ, nên API ở đây có vẻ hợp lý. Mặc dù những người khác lưu ý rằng nó "nên" có thể tạo ra một chuỗi trung lập kết nối, xuất hiện bên ngoài phạm vi của toRawSql.

Bạn đề cập rằng bạn không thể sử dụng MonadLoggernhư được khuyến nghị. Bạn đã thử gì, và điều gì đã xảy ra?


Tôi không thể nhớ những gì tôi đã cố gắng với MonadLoggerkhông may. Đó là một thời gian trước đây.
Tom Ellis

Bạn có tình cờ có một dự án thử nghiệm để xem liệu toRawSqlbây giờ có hoạt động cho trường hợp sử dụng của câu hỏi này không? Tôi đã thiết lập một esqueletomôi trường để dùng thử, nhưng tôi chưa có thời gian để tìm hiểu persistentvà tất cả các máy móc khác để thực sự xây dựng và sử dụng một truy vấn thực sự.
Christian Conkle

Tôi không có bất kỳ loại môi trường thử nghiệm hoặc bất kỳ dự án esqueleto nào cả, xin lỗi.
Tom Ellis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.