2013-02-13 5 views
8

Aufgrund der Natur der Thema Daten, die ich in einem Projekt von mir verwende, sind doppelte Datensätze in den Eingabesätzen häufig zu treffen (manchmal bedeutet es doppelte Datensätze in der gleichen Eingabesatz, und dies kann leicht durch pre behandelt werden -Insert-Filterung, aber in der Regel kann der Eingabe-Satz Datensätze enthalten, die Duplikate von bereits in der Datenbank vorhandenen Datensätzen sind.Wie mache ich eine INSERT IGNORE Abfrage mit Slick?

MySQL und SQLite INSERT IGNORE Funktion hilft sehr dabei.

So sind die Fragen, die ich habe, sind:

  1. Wie Slick verursachen INSERT IGNORE verwenden anstelle von bloßen INSERT, wenn Daten in einer MySQL oder SQLite Datenbank einfügen?

  2. Was ist der optimale Weg, um INSERT IGNORE Funktionalität zu emulieren, wenn Sie Slick mit MS SQL Server verwenden, die es nicht nativ unterstützt?

+1

Ich schlage vor, Sie eine Feature-Anfrage für Slick zu erhöhen, ich denke, mehr Menschen würden davon profitieren, wenn dies als Standard-Methode verfügbar wäre. – EECOLOR

Antwort

5

Ich habe keine Erfahrung mit Slick. Aus dem Quellcode entnahm ich, daß, um Slick zu verursachen können INSERT IGNORE verwenden Sie ein paar Schritte ausführen müssten:

  • Erweitert die Treiber der gewünschten Datenbank
  • Aufschalten der Standard InsertBuilder die erstellt wird, durch def createInsertBuilder(node: Node): InsertBuilder. Erweitern Sie es und fügen Sie eine spezielle Methode hinzu, die der buildInsert-Methode ähnelt.
  • Überschreiben Sie den Standardwert InsertInvoker, der durch def createCountingInsertInvoker[T, U](u: ShapedValue[T, U]) erstellt wird. Erweitern Sie es und fügen Sie insertIgnore die von FullInsertInvoker

Was Ihre zweite Frage zu def insert[TT](query: Query[TT, U])(implicit session: Session): RetQuery ähnlich sein sollte. Die Implementierung einer Problemumgehung für INSERT IGNORE, wenn es nicht datenbankabhängig ist, Google wird Ihnen helfen, die verschiedenen Implementierungen zu finden. Da die obige Methode zum Hinzufügen von INSERT IGNORE treiberunabhängig ist, könnten Sie die gleiche Struktur verwenden, um die Funktionalität für jede Datenbank hinzuzufügen.