从模型生成 1.sql 的简单方法?
Easy way to generate 1.sql from model?
作为一个 Slick 菜鸟,我不明白为什么我必须两次指定我的模型,首先是在 Scala 中,然后是在 1.sql 中来创建表。那看起来不干。有没有一种简单的方法可以在开发过程中从模型生成 1.sql(和 2..n.sql)?
...ddl.create 自 slick 3.0 起不再受支持。可以在以下页面底部找到动机:https://www.playframework.com/documentation/2.4.x/PlaySlickMigrationGuide
所以我必须手动编辑我的模式或使用代码生成。
我创建了自己的 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 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--------------------------")
}
}
您可以从激活器控制台执行任务:generate_schema
。
希望对您有所帮助。
作为一个 Slick 菜鸟,我不明白为什么我必须两次指定我的模型,首先是在 Scala 中,然后是在 1.sql 中来创建表。那看起来不干。有没有一种简单的方法可以在开发过程中从模型生成 1.sql(和 2..n.sql)?
...ddl.create 自 slick 3.0 起不再受支持。可以在以下页面底部找到动机:https://www.playframework.com/documentation/2.4.x/PlaySlickMigrationGuide 所以我必须手动编辑我的模式或使用代码生成。
我创建了自己的 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 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--------------------------")
}
}
您可以从激活器控制台执行任务:generate_schema
。
希望对您有所帮助。