scala - Creación de tabla en juego 2.4 con play-slick 1.0
playframework playframework-2.0 (1)
Gran pregunta: ¡estaba en el mismo barco que tú!
Solo tendría el DAO y este código:
TableQuery[UsersTable].schema.create
que creará la tabla de la base de datos para ti. No es necesario para .sql
.
En consecuencia, para soltar, use .drop
lugar de .create
.
También puede combinar la creación de tablas de varias tablas con reduceLeft
. Así es como lo hago:
lazy val allTables = Array(
TableQuery[AcceptanceTable].schema,
[... many more ...]
TableQuery[UserTable].schema
).reduceLeft(_ ++ _)
/** Create all tables in database */
def create = {
allTables.create
}
/** Delete all tables in database */
def drop = {
allTables.drop
}
Todo lo que necesitará la API del controlador en el alcance, tales como:
val profile = slick.driver.H2Driver
import profile.api._
Obtuve el módulo play-slick y también estoy usando evolution para crear las tablas necesarias en la base de datos durante el inicio de la aplicación.
Para que la evolución funcione, se requiere escribir un script 1.sql
que contenga las definiciones de tabla que quiero crear. Por el momento se ve así:
# --- !Ups
CREATE TABLE Users (
id UUID NOT NULL,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL,
firstname varchar(255),
lastname varchar(255),
username varchar(255),
age varchar(255),
PRIMARY KEY (id)
);
# --- !Downs
DROP TABLE Users;
Hasta ahora todo está bien, pero para que Slick funcione correctamente también necesita saber la definición de mi tabla. Entonces tengo un objeto UserDAO
que se ve así:
class UserDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
import driver.api._
private val Users = TableQuery[UsersTable]
def all(): Future[Seq[User]] = db.run(Users.result)
def insert(user: User): Future[User] = db.run(Users += user).map { _ => user }
//Table definition
private class UsersTable(tag:Tag) extends Table[User](tag,"users"){
def id = column[UUID]("id", O.PrimaryKey)
def email = column[String]("email")
def password = column[String]("password")
def firstname = column[Option[String]]("firstname")
def lastname = column[Option[String]]("lastname")
def username = column[Option[String]]("username")
def age = column[Int]("age")
def * = (id, email,password,firstname,lastname,username,age) <> ((User.apply _).tupled, User.unapply)
}
}
Básicamente, ahora tengo la misma definición de tabla en dos lugares diferentes. Una vez en el script 1.sql
y una vez en la clase UserDAO.
¡Realmente no me gusta este diseño! Tener las mismas definiciones de tabla en dos lugares diferentes no parece ser correcto.
¿Hay alguna forma de generar los scripts de evolución a partir de las definiciones de tabla dentro de las clases de UserDAO? ¿O hay una forma completamente diferente de generar las definiciones de tabla durante el inicio (quizás solo usando slick)? Realmente me gustaría utilizar solo la definición de la tabla "slick" y deshacerme de los molestos scripts de SQL.
Estoy usando play-2.4
y play-slick-1.0
Muchas gracias.