2013-04-25 2 views
0

Как я могу вставить, если запись еще не существует с помощью Squeryl?Squeryl: Вставить, если не существует?

Я попытался поймать PSQLException, если инструкция insert выполняется на уже существующем кортеже, но это не сработает (PSQLException не зацепился). На самом деле было бы лучше сказать Squeryl, чтобы не вставлять уже существующие кортежи. Это то, что я ищу.

ответ

0

Вы не хотите, чтобы одни и те же кортежи существовали в БД вообще или только этот squeryl не вставлял их?

В первом случае просто добавьте уникальное ограничение на этот кортеж. Пример:

on(myTable)(e => declare(
    columns(e.name, e.year) are (indexed("myIndex"), unique) 
)) 

Этот код должен быть размещен вблизи определения таблиц, как val myTable = table[MyTable]. Я также добавил индекс в этот кортеж, вы можете оставить этот код, если хотите.

+0

Первый обрабатывается базой данных. Это не позволяет одному кортежу существовать более одного раза. Так что это не то, что я хочу. На самом деле мне просто нужен Squeryl, чтобы избежать нежелательных вставок, которые в любом случае будут отклонены базой данных, выбрасывая исключение (которое не зависает в случае сброшенного PSQLException) – ideaboxer

2

К сожалению, если вы используете Postgres, если возникло исключение, вы не сможете продолжить обработку. Здесь довольно неплохо обсуждается это: https://groups.google.com/forum/?fromgroups=#!topic/squeryl/zaflXRra0qg

Чтобы сделать то, что вы ищете, вы, вероятно, захотите выбрать сначала, чтобы найти ids, которые уже существуют, и удалить их из предметов, которые вы ищете вставить.

+0

Могу ли я сделать выбор и вставить в атомную операцию? – ideaboxer

+1

Не то, чтобы я мог думать о себе, однако вы, вероятно, могли бы начать транзакцию, затем захватите сырой сеанс jdbc, чтобы вызвать блокировку таблицы, а затем выполните свои команды. Не суперэффективно, но будет атомарным. – jcern

+0

Спасибо. Это звучит очень сложно ... – ideaboxer

Смежные вопросы