Slick 2.0: Удалить несколько строк

Что я хотел сделать, так это удалить N самых старых идентификаторов из моей таблицы, используя эту функцию:

def deleteOldRows(size: Int)(implicit s: Session): Int =
  MyTable.sortBy(_.id.asc).take(size).delete

Эта операция выдает SlickException, потому что

Запрос для оператора DELETE должен разрешаться для понимания с одной таблицей -- Неподдерживаемая форма: понимание (выборка = нет, смещение = нет)

Как указано также в документации:

Запрос на удаление должен выбирать только из одной таблицы. Любая проекция игнорируется (всегда удаляются полные строки).

Что вызывает множественную таблицу? Это потому, что предложение sortBy создает временную таблицу для хранения результатов? На данный момент я переписал свой запрос на это:

MyTable.sortBy(_.id.asc).take(size).list().map(result => MyTable.filter(_.id === result.id).delete)

Что в основном берет идентификаторы и для каждого из них фильтрует и удаляет, есть ли более читаемый и прямой способ удалить несколько строк одновременно?


person Ende Neu    schedule 29.06.2014    source источник


Ответы (1)


Попробуйте MyTable.filter(_.id in MyTable.sortBy(_.id.asc).take(size).map(_.id)).delete. Не вдаваясь в детали прямо сейчас, я предполагаю, что сообщение об ошибке вводит в заблуждение, а причина в том, что ORDER BY и LIMIT не поддерживаются для DELETE.

Я создал тикет: https://github.com/slick/slick/issues/872

person cvogt    schedule 29.06.2014