Как я могу избежать многословности и повторяемости декларации модели Слика
В настоящее время я использую 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 и объект доступа, мне придется объявить каждое поле три раза. Есть ли способ избежать этой склонной к ошибкам повторяемости?
Update : Of конечно, решение этой проблемы должно поддерживать операции чтения и записи .
2 ответа:
Можно использовать генерацию кода или в будущем: поставщики типов.
См. https://groups.google.com/d/msg/scalaquery/Pdp3GTXsKCo/O0e3JLXAaK8J
Можно использовать прямое встраивание. Это экспериментальный API на основе макросов, который позволяет вам писать таблицы следующим образом:
@table("COFFEES") case class Coffee( @column("COF_NAME") name: String, @column("SUP_ID") supID: Int, @column("PRICE") price: Double ) val coffees = Queryable[Coffee]
Edit:
Документы здесь: http://slick.typesafe.com/doc/1.0.1/direct-embedding.html