Как я могу избежать многословия и повторяемости объявления модели Slick

В настоящее время я использую Slick 1.x для доступа к MySQL в рамках playframework 2.1.3. Хотя в целом функции Slick выглядят довольно хорошо, я не могу понять, насколько повторяющимся является синтаксис объявлений. Я имею в виду, взгляните на следующий код:

case class User
 (id: Option[Long]
 , firstName: String
 , lastName: String
 , email: String
 , password: String
 , status: String
 , createDate: Long = Platform.currentTime
 , firstLogin: Option[Long]
 , lastLogin: Option[Long]
 , passwordChanged: Option[Long]
 , failedAttempts: Int = 0
  )

object User extends Table[User]("USER") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def firstName = column[String]("firstName", O.NotNull)
  def lastName = column[String]("lastName", O.NotNull)
  def email = column[String]("mail", O.NotNull)
  def password = column[String]("password", O.NotNull)
  def status = column[String]("status", O.NotNull)
  def createDate = column[Long]("createDate", O.NotNull)
  def firstLogin = column[Long]("firstLogin", O.Nullable)
  def lastLogin = column[Long]("lastLogin", O.Nullable)
  def passwordChanged = column[Long]("passwordChanged", O.Nullable)
  def failedAttempts = column[Int]("failedAttempts", O.NotNull)

  def * = id.? ~ firstName ~ lastName ~ email ~ password ~ status ~ createDate ~ firstLogin.? ~ lastLogin.? ~ passwordChanged.? ~ failedAttempts <>(User.apply _, User.unapply _)
  def autoInc = * returning id
}

Не может быть так, что для того, чтобы иметь простой класс case и объект доступа, мне придется объявлять каждое поле три раза. Есть ли способ избежать повторения этой ошибки?

Обновление. Разумеется, решение этой проблемы должно поддерживать операции чтения и записи.


person keyboardsamurai    schedule 14.08.2013    source источник


Ответы (2)


Вы можете использовать генерацию кода или в будущем: поставщики типов.

См. https://groups.google.com/d/msg/scalaquery/Pdp3GTXsKCo/O0e3JLXAaK8J

person cvogt    schedule 20.08.2013
comment
Из темы: Поставщики типов на основе генерации исходного кода, скорее всего, будут поставляться с грядущим Slick 2.1 позже в этом году. т. е. их нельзя использовать для производства с 1.x. Генераторы кода - действительно хороший способ создавать более хрупкий код, но взамен они не добавляют много гибкости. - person keyboardsamurai; 21.08.2013
comment
По сути, это просто решает первый шаг управления моделью. Вам придется регенерировать и терять изменения и т. Д. Это не тот шаблон, с которым мне удобно. Но я думаю, пока 2.x не станет золотым, это придется делать. - person keyboardsamurai; 24.08.2013
comment
Это верно только в том случае, если вы используете плохие генераторы кода. С хорошими генераторами кода вы можете работать очень гибко. Хитрость заключается в том, что генератор кода должен либо выдать код, который является расширяемым, например. базовые классы, которые вы настраиваете в подклассах. Или сам генератор кода должен быть полностью настраиваемым, как в случае с генератором по адресу github.com/cvogt/migrations/blob/master/src/main/scala/ / github.com/cvogt/migrations/tree/master/src/main/scala/scala/ . Или оба. - person cvogt; 27.08.2013
comment
Вы также можете интегрировать генератор кода Slick 2.0 с Play Framework Evolutions. Пример проекта я разместил здесь: blog.papauschek.com/2013/12/ Я думаю, что вопрос сводится к следующему: сначала код или база данных? По сути, вы хотите написать SQL или Scala для определения ваших таблиц? Исходя из моего личного опыта работы с более крупными проектами, теперь я предпочитаю писать SQL для определения моей базы данных. Больше никаких дырявых абстракций. - person Chris; 30.12.2013
comment
Да, ищите генерацию кода. Мы решили, что на данный момент генерация кода перед компиляцией более практична, чем генерация кода на основе макросов. - person cvogt; 29.12.2014

Вы можете использовать прямое встраивание. Это экспериментальный API на основе макросов, который позволяет вам писать таблицы следующим образом:

@table("COFFEES") case class Coffee(
  @column("COF_NAME")  name:  String,
  @column("SUP_ID") supID: Int,
  @column("PRICE") price: Double
)
val coffees = Queryable[Coffee]

изменить:

Документы находятся здесь: http://slick.typesafe.com/doc/1.0.1/direct-embedding.html

person drexin    schedule 14.08.2013
comment
О, только что заметил это из документов Прямое встраивание в настоящее время не предусматривает вставку данных. - это делает его непригодным для меня. - person keyboardsamurai; 14.08.2013