2013-02-13 15 views
8

Ze względu na charakter danych podmiotu, których używam w projekcie moim, zduplikowane rekordy są często spotykane w zestawach wejściowych (czasami oznacza to duplikowanie rekordów w tym samym zestawie wejściowym, a to może być łatwo obsłużone przez pre -instrukcja filtrowania, ale zazwyczaj zestaw wejściowy może zawierać rekordy będące duplikatami rekordów już znajdujących się w bazie danych).Jak wykonać zapytanie INSERT IGNORE za pomocą aplikacji Slick?

Funkcja MySQL i SQLite INSERT IGNORE pomaga w rozwiązaniu tego problemu.

Więc pytania ja mam to:

  1. Jak spowodować Slick używać INSERT IGNORE zamiast gołe INSERT podczas wstawiania danych do bazy danych MySQL lub SQLite?

  2. Jaki jest optymalny sposób emulowania funkcji INSERT IGNORE podczas korzystania z programu Slick przy użyciu serwera MS SQL Server, który nie obsługuje go natywnie?

+1

Proponuję zgłosić prośbę o funkcję dla Slick, myślę, że więcej osób skorzystałoby, jeśli jest to metoda domyślna. – EECOLOR

Odpowiedz

5

Nie mam doświadczenia ze Slick. Z kodu źródłowego Zebrałem że aby spowodować Slick, aby móc korzystać INSERT IGNORE będzie trzeba wykonać kilka czynności:

  • Rozszerza kierowcę pożądanej bazy
  • zastąpić domyślny InsertBuilder który jest tworzony przez def createInsertBuilder(node: Node): InsertBuilder. Rozszerz go i dodaj wyspecjalizowaną metodę podobną do metody buildInsert.
  • Zastępuje domyślną InsertInvoker, która jest tworzona przez def createCountingInsertInvoker[T, U](u: ShapedValue[T, U]). Rozszerzyć i dodać insertIgnore który powinien być podobny do def insert[TT](query: Query[TT, U])(implicit session: Session): RetQuery z FullInsertInvoker

Co do drugiego pytania. Implementacja obejścia dla INSERT IGNORE, gdy nie jest obsługiwana, zależy od bazy danych, Google pomoże znaleźć różne implementacje. Ponieważ powyższy sposób dodania INSERT IGNORE jest niezależny od sterownika, można użyć tej samej struktury do dodania funkcjonalności dla dowolnej bazy danych.

Powiązane problemy