2013-02-13 36 views
8

Do tính chất của dữ liệu chủ đề tôi sử dụng trong dự án của tôi, bản ghi trùng lặp thường xuyên được đáp ứng trong bộ nhập liệu (một số lần có nghĩa là bản ghi trùng lặp trong cùng một bộ nhập) và điều này có thể dễ dàng xử lý trước lọc -insert, nhưng thường bộ đầu vào có thể chứa các bản ghi trùng lặp các bản ghi đã có trong cơ sở dữ liệu).Làm thế nào để thực hiện truy vấn INSERT IGNORE với Slick?

Tính năng MySQL và SQLite INSERT IGNORE giúp rất nhiều trong việc xử lý việc này.

Vì vậy, các câu hỏi tôi đã có là:

  1. Làm thế nào để gây Slick để sử dụng INSERT IGNORE thay vì trần INSERT khi chèn dữ liệu vào một cơ sở dữ liệu MySQL hoặc SQLite?

  2. Cách tối ưu để mô phỏng chức năng INSERT IGNORE khi sử dụng Slick với MS SQL Server không hỗ trợ nó là gì?

+1

Tôi đề nghị bạn đưa ra yêu cầu tính năng cho Slick, tôi nghĩ nhiều người hơn sẽ hưởng lợi nếu điều này có sẵn dưới dạng phương thức mặc định. – EECOLOR

Trả lời

5

Tôi không có kinh nghiệm với Slick. Từ mã nguồn tôi thu thập được rằng để gây Slick để có thể sử dụng INSERT IGNORE bạn sẽ cần phải thực hiện một vài bước sau:

  • Mở rộng điều khiển cơ sở dữ liệu mong muốn
  • Ghi đè mặc định InsertBuilder mà được tạo ra qua số def createInsertBuilder(node: Node): InsertBuilder. Mở rộng nó và thêm một phương pháp chuyên ngành tương tự như phương pháp buildInsert.
  • Ghi đè mặc định InsertInvoker được tạo thông qua def createCountingInsertInvoker[T, U](u: ShapedValue[T, U]). Mở rộng nó và thêm insertIgnore cần được tương tự để def insert[TT](query: Query[TT, U])(implicit session: Session): RetQuery từ FullInsertInvoker

Đối với câu hỏi thứ hai của bạn. Việc triển khai giải pháp thay thế cho INSERT IGNORE khi không được hỗ trợ là phụ thuộc vào cơ sở dữ liệu, google sẽ giúp bạn tìm các triển khai khác nhau. Vì phương pháp thêm INSERT IGNORE ở trên là độc lập với trình điều khiển, bạn có thể sử dụng cùng một cấu trúc để thêm chức năng cho bất kỳ cơ sở dữ liệu nào.

Các vấn đề liên quan