Как сделать запрос INSERT IGNORE с помощью Slick?

Из-за характера предметных данных, которые я использую в моем проекте, во входных наборах часто встречаются повторяющиеся записи (иногда это означает дублирование записей в одном и том же входном наборе, и это можно легко обработать с помощью предварительной вставки). фильтрации, но обычно входной набор может содержать записи, которые являются дубликатами записей, уже находящихся в базе данных).

Функция MySQL и SQLite INSERT IGNORE очень помогает справиться с этим.

Итак, вопросы, которые у меня есть:

  1. Как заставить Slick использовать INSERT IGNORE вместо голого INSERT при вставке данных в базу данных MySQL или SQLite?

  2. Каков оптимальный способ эмуляции функциональности INSERT IGNORE при использовании Slick с MS SQL Server, который изначально не поддерживает его?


person Ivan    schedule 13.02.2013    source источник
comment
Я предлагаю вам подать запрос на функцию Slick, я думаю, что больше людей выиграют, если это будет доступно по умолчанию.   -  person EECOLOR    schedule 18.02.2013


Ответы (1)


У меня нет опыта работы со Сликом. Из исходного кода я понял, что для того, чтобы Slick мог использовать INSERT IGNORE, вам нужно выполнить несколько шагов:

  • Расширяет драйвер нужной базы данных
  • Переопределите значение по умолчанию InsertBuilder, созданное с помощью def createInsertBuilder(node: Node): InsertBuilder. Расширьте его и добавьте специализированный метод, похожий на метод buildInsert.
  • Переопределите значение по умолчанию InsertInvoker, созданное с помощью def createCountingInsertInvoker[T, U](u: ShapedValue[T, U]). Расширьте его и добавьте insertIgnore, который должен быть похож на def insert[TT](query: Query[TT, U])(implicit session: Session): RetQuery из FullInsertInvoker.

Что касается вашего второго вопроса. Реализация обходного пути для INSERT IGNORE, когда он не поддерживается, зависит от базы данных, Google поможет вам найти различные реализации. Поскольку описанный выше метод добавления INSERT IGNORE не зависит от драйвера, вы можете использовать ту же структуру для добавления функциональности для любой базы данных.

person EECOLOR    schedule 18.02.2013