As a Slick noob I do not understand why I have to specify my model twice, first in Scala and then in 1.sql to create the tables. That does not look DRY. Is there an easy way to generate 1.sql (and 2..n.sql) from the model during development?
Asked
Active
Viewed 220 times
0
-
I've used slick 2.0. I don't know what is "1.sql". I've used ${tableName}.ddl.create to create the tables. – nikiforo Dec 30 '15 at 14:51
-
DDL was the keyword to search for. And it was removed in 3.0. – Hans Dec 30 '15 at 16:58
2 Answers
1
I created my own sbt task to easily generate the 1.sql from model using the code generation:
in build.sbt file:
val generate_schema = taskKey[Unit]("Schema Generator")
generate_schema <<= (fullClasspath in Runtime) map {classpath =>
val loader: ClassLoader = ClasspathUtilities.toLoader(classpath.map(_.data).map(_.getAbsoluteFile))
val schemaGenerator = loader.loadClass("misc.SchemaGenerator").newInstance().asInstanceOf[Runnable]
schemaGenerator.run
}
the misc.SchemaGenerator class:
package misc
import models.Article
import models.Category
import play.api.Logger
import slick.driver.PostgresDriver.api._
import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.reflect.io.File
class SchemaGenerator extends Runnable {
def run = {
println("---------------------GENERATING SCHEMA.....")
val categories = TableQuery[Category]
val articles = TableQuery[Article]
val file = File("/home/pedro/NetBeansProjects/play-scala-angular-sample/my-blog-server/conf/evolutions/default/1.sql")
val sb = new StringBuilder("# --- !Ups \n\n")
categories.schema.create.statements.foreach(st => sb.append(st.toString + ";\n"))
sb.append("\n\n")
articles.schema.create.statements.foreach(st => sb.append(st.toString + ";\n"))
sb.append("\n\n")
sb.append("# --- !Downs")
sb.append("\n\n")
categories.schema.drop.statements.foreach(st => sb.append(st.toString + ";\n"))
sb.append("\n\n")
articles.schema.drop.statements.foreach(st => sb.append(st.toString + ";\n"))
// Logger.info("value: [" + sb + "] sb")
file.writeAll(sb.toString)
Logger.info("----------------------FINISHED GENERATING SCHEMA--------------------------")
}
}
You can execute the task from the activator console: generate_schema
.
Hope it helps.

Pedro Hidalgo
- 861
- 10
- 15
0
...ddl.create is no longer supported since slick 3.0. A motivation can be found at the bottom of the following page: https://www.playframework.com/documentation/2.4.x/PlaySlickMigrationGuide So I have to hand edit my schemas or use code generation.

Hans
- 467
- 4
- 12