2015-06-19 12 views
5

Ho ottenuto il modulo play-slick attivo e sto usando anche evolution per creare le tabelle richieste nel database durante l'avvio dell'applicazione.Creazione tabella in gioco 2.4 con play-slick 1.0

Per l'evoluzione al lavoro è necessario scrivere uno script 1.sql che contiene le definizioni di tabella che voglio creare. Al momento sembra che questo:

# --- !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; 

Fin qui tutto bene, ma per Slick per funzionare correttamente anche bisogno di conoscere la definizione del mio tavolo. Così ho un oggetto UserDAO che assomiglia a questo:

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) 
    } 
} 

ho praticamente hanno lo stesso definizione della tabella in due posti differenti ora. Una volta nello script 1.sql e una volta nella classe UserDAO.

Davvero non mi piace affatto questo disegno! Non avere le stesse definizioni di tabella in due posti diversi non è giusto.

C'è un modo per generare gli script di evoluzione dalle definizioni di tabella all'interno delle classi UserDAO? O c'è un modo completamente diverso di generare le definizioni delle tabelle durante l'avvio (forse solo usando slick)? Mi piacerebbe davvero usare solo la definizione della tabella slick e sbarazzarsi dei fastidiosi script SQL.

Sto usando play-2.4 e play-slick-1.0

Grazie mille.

risposta

4

Ottima domanda - Ero nella stessa barca come te!

avrei avuto solo il DAO e questo codice:

TableQuery[UsersTable].schema.create 

which'll creare la tabella del database per voi. Non è necessario il .sql.

Corrispondentemente, per eliminare, utilizzare .drop anziché .create.

È inoltre possibile combinare la creazione di tabelle di più tabelle utilizzando reduceLeft. Ecco come lo faccio:

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 
} 

Tutto ciò che sarà necessario il driver API portata quali:

val profile = slick.driver.H2Driver 
import profile.api._ 
+1

Esattamente dove hai messo il 'TableQuery [UsersTable] .schema.create' chiamano? – evermean

+0

Molto importante è l'ambito di seguito riportato: val profile = slick.driver.H2Driver import profile.api._ – bjfletcher

+0

Nessuna nuova riga con commenti, ma guarda la parte inferiore della risposta aggiornata. – bjfletcher