Как использовать генератор кода Slick для включения представлений базы данных?

Я пытаюсь сгенерировать код Scala для таблиц и представлений базы данных в моей схеме, используя Slick 3.0.3. Взяв в качестве примера этот блог, у меня есть следующий файл build.sbt. Однако это сгенерирует код для моих таблиц базы данных и не будет включать представления базы данных. Как я могу получить просмотры?

Согласно slick issue 1022 я вижу, что это можно сделать, но API не выглядит одинаково, и slick.codegen.SourceCodeGenerator не имеет getTables или defaultTables для включения имен представлений.

name := "slickCodeGen"

version := "1.0"

scalaVersion := "2.11.6"

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8")

libraryDependencies ++= Seq(
  "com.typesafe.slick" %% "slick" % "3.0.3",
  "com.typesafe.slick" %% "slick-codegen" % "3.0.3",
  "org.postgresql" %  "postgresql" % "9.4-1201-jdbc41",
  "com.zaxxer" % "HikariCP" % "2.3.2",
  "org.scalatest" %% "scalatest" % "2.2.4" % "test"
)

slick <<= slickCodeGenTask

sourceGenerators in Compile <+= slickCodeGenTask

lazy val slick = TaskKey[Seq[File]]("gen-tables")
lazy val slickCodeGenTask = (sourceManaged, dependencyClasspath in Compile, runner in Compile, streams) map { (dir, cp, r, s) =>
  val outputDir = (dir / "main/slick").getPath
  val username = "postgres"
  val password = "xxx"
  val url = "jdbc:postgresql://localhost:5555/testdb?searchpath=public"
  val jdbcDriver = "com.postgresql.jdbc.Driver"
  val slickDriver = "slick.driver.PostgresDriver"
  val pkg = "folder1.folder2"
  toError(r.run("slick.codegen.SourceCodeGenerator", cp.files, Array(slickDriver, jdbcDriver, url, outputDir, pkg, username, password), s.log))
  val fname = outputDir + "/folder1/folder2/" + "Tables.scala"
  Seq(file(fname))
}

person SkyWalker    schedule 24.09.2015    source источник
comment
Честно говоря, у меня не было большого успеха с управляемым Slick DDL, который включал бы представления. В итоге я определил представления в необработанном SQL и просто сопоставил их с классами. Мне не терпится узнать, получите ли вы какие-нибудь ответы.   -  person Patryk Ćwiek    schedule 24.09.2015


Ответы (1)


После многочисленных проб и ошибок из-за множества изменений в API-интерфейсе генератора Slick, следующее отдельное приложение, Generator.scala протестированное , будет генерировать код как для таблиц, так и для представлений в Slick 3.0.3:

import java.util.concurrent.TimeUnit

import slick.driver.PostgresDriver
import slick.jdbc.meta.MTable
import slick.codegen.SourceCodeGenerator
import slick.driver.PostgresDriver.simple._
import play.api.libs.concurrent.Execution.Implicits._

import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}

object Generator extends App {
  val slickDriver = "slick.driver.PostgresDriver"
  val jdbcDriver = "org.postgresql.Driver"
  val url = "jdbc:postgresql://localhost:5555/testdb?searchpath=public"
  val outputDir = "/tmp/"
  val pkg = "folder1.folder2"
  val username = "postgres"
  val password = "xxx"

  val db = Database.forURL(url, user, password)
  val dbio = PostgresDriver.createModel(Some(MTable.getTables(None, None, None, Some(Seq("TABLE", "VIEW")))))
  val model = db.run(dbio)
  val future : Future[SourceCodeGenerator] = model.map(model => new SourceCodeGenerator(model))
  val codegen : SourceCodeGenerator = Await.result(future, Duration.create(5, TimeUnit.MINUTES))
  codegen.writeToFile(slickDriver, outputDir, pkg, "Tables", "Tables.scala")
}

Интеграция этого кода в build.sbt не так проста, поскольку требует определения внешнего файла генератора пользовательского кода, а затем его компиляции и запуска из build.sbt перед компиляцией фактического проекта. Очень устаревший пример этого можно найти в проекте github slick-codegen-customization-example но учтите, что у них не build.sbt, а более продвинутый Build.scala

person SkyWalker    schedule 28.09.2015
comment
Мне удалось продвинуться довольно далеко самостоятельно, но когда я увидел другие варианты использования MTable, я был уверен, что Seq("TABLE","VIEW") был просто заполнителем для фактических имен таблиц и представлений, которые вы хотели включить, а не метаданными. Есть час, я не вернусь. - person Ahmad Ragab; 07.02.2016