Отбрасывать значения при вставке и обновлении данных с помощью slick

Я использую slick с play2. У меня есть несколько полей в базе данных, которыми управляет база данных. Я не хочу их создавать или обновлять, однако я хочу получить их при чтении значений.

Например, предположим, что у меня есть

case class MappedDummyTable(id: Int, .. 20 other fields, modified_time: Optional[Timestamp])

который отображает Dummy в базе данных. modified_time управляется базой данных.

Проблема в том, что во время insert или update я создаю экземпляр MappedDummyTable без измененного атрибута времени и передаю его в slick для создания/обновления, например

TableQuery[MappedDummyTable].insert(instanceOfMappedDummyTable)

Для этого Slick создает запрос как


Insert INTO MappedDummyTable(id,....,modified_time) Values(1,....,null)

и обновляет модифицированное_время как NULL, чего я не хочу. Я хочу, чтобы Slick игнорировал поля при обновлении и создании.

Для обновления я могу сделать

TableQuery[MappedDummyTable].map(fieldsToBeUpdated).update(values)

но это приводит к 20 нечетным полям в методе map, что выглядит некрасиво.

Есть ли лучший способ?

Обновлять:

Лучшим решением, которое я нашел, было использование множественной проекции. Я создал одну проекцию для получения значений, а другую для обновления и вставки данных.


person mohit    schedule 13.11.2014    source источник


Ответы (2)


возможно, вам нужно написать несколько триггеров в таблице, если вы не хотите писать код типа row => (row.id,...other 20 fields)

или попробовать использовать None вместо null?

person fairjm    schedule 05.12.2014
comment
Никто не преобразуется в null с помощью slick - person mohit; 07.12.2014

Я считаю, что решение с отображением поля не по умолчанию - единственный способ сделать это с помощью Slick. Чтобы сделать его менее уродливым, вы можете определить функцию ignoreDefaults для MappedDummyTable, которая будет возвращать только значение, отличное от значения по умолчанию, и функцию в сопутствующем объекте для класса случая MappedDummyTable, который возвращает проекцию

TableQuery[MappedDummyTable].map(MappedDummyTable.ignoreDefaults).insert(instanceOfMappedDummyTable.ignoreDefaults)
person Gennadiy    schedule 07.12.2014
comment
Можете ли вы привести пример? У меня есть несколько столбцов со значениями по умолчанию. Когда я передам некоторые значения для них, они будут проигнорированы? - person mohit; 07.12.2014