2013-11-09 2 views

ответ

2

Допустим, у вас есть следующий класс случая и Slick таблица:

case class User(id: Option[Int], first: String, last: String) 

object Users extends Table[User]("users") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def first = column[String]("first") 
    def last = column[String]("last") 
    def * = id.? ~ first ~ last <> (User, User.unapply _) 
} 

важные вещи, чтобы рассмотреть здесь является тем фактом, что User.id является вариантом, потому что, когда мы создаем его мы установим его None и DB будут генерировать номер для него.

Теперь вам нужно определить новое сопоставление вставки, которое опускает автоинкрементный столбец. Это необходимо, потому что некоторые базы данных не позволяют вставлять в столбец, который помечен как Auto Incremental. Таким образом, вместо:

INSERT INTO users VALUES (NULL, "first, "last") 

Slick сгенерирует:

INSERT INTO user(first, last) VALUES ("first", "last") 

отображение выглядит следующим образом (который должен быть помещен внутрь пользователей):

def forInsert = first ~ last <> ({ t => User(None, t._1, t._2)}, { (u: User) => Some((u.first, u.last))}) 

Наконец получать автоматически сгенерированный идентификатор просто. Нам нужно только указать в возвращающей колонке ID:

val userId = Users.forInsert returning Users.id insert User(None, "First", "Last") 

Или вы могли бы вместо того, чтобы переместить возвращающегося заявление:

def forInsert = first ~ last <> ({ t => User(None, t._1, t._2)}, { (u: User) => Some((u.first, u.last))}) returning id 

и упростить вставку вызовов:

val userId = Users.forInsert insert User(None, "First", "Last") 

Source

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