从模型生成1.sql的简单方法?

时间:2015-12-30 10:19:37

标签: scala playframework slick play-slick

作为一个Slick noob我不明白为什么我必须两次指定我的模型,首先在Scala中,然后在1.sql中创建表。这看起来并不干净。有没有一种简单的方法可以在开发期间从模型生成1.sql(和2..n.sql)?

2 个答案:

答案 0 :(得分:1)

我创建了自己的sbt任务,可以使用代码生成轻松地从模型生成1.sql:

build.sbt文件中的

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
}

misc.SchemaGenerator类:

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

}

您可以从激活控制台执行任务:generate_schema

希望它有所帮助。

答案 1 :(得分:0)

...自从光滑3.0以来不再支持ddl.create。可以在以下页面的底部找到一个动机:https://www.playframework.com/documentation/2.4.x/PlaySlickMigrationGuide 所以我必须手工编辑我的模式或使用代码生成。