Генерация кода с использованием Slick Codegen 3.1.1 для нескольких схем

У меня есть требование генерировать пользовательский код Slick для таблиц, представленных в схеме, которые не принадлежат мне, но имеют права доступа к ним. Код, который я использую:

import scala.util.{Failure, Success}
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import com.typesafe.slick.driver.oracle.OracleDriver

object CustomCodeGenerator extends  App{

  val url = "jdbc:oracle:thin:@//localhost:1521/xe"
  val jdbcDriver = "oracle.jdbc.OracleDriver"
  val userName = "user"
  val password = "password"
  val db = OracleDriver.api.Database.forURL(url,user=userName,password=password,driver=jdbcDriver)

  // filter out desired tables
  val included = Seq("GEO.BR_FLD","GEO.FLD_GM_SDO","GEO.BR_REP","GEO.PLT","GEO.PLT_GM_SDO")
  val codegen = db.run{
    OracleDriver.defaultTables.map(_.filter(t => included contains t.name.name)).flatMap( OracleDriver.createModelBuilder(_,false).buildModel)
  }
    .map{ model =>
      new slick.codegen.SourceCodeGenerator(model){
        override def entityName = dbTableName => dbTableName match {
          case "GEO.BR_FLD" => "BrFld"
          case "GEO.FLD_GM_SDO" => "FldGmSDO"
          case "GEO.BR_REP" => "BrRep"
          case "GEO.PLT" => "Plt"
          case "GEO.PLT_GM_SDO" => "PltGmSDO"
          case _ => super.entityName(dbTableName)
        }
      }
    }
  Await.ready(
    codegen.map(_.writeToFile(
      "com.typesafe.slick.driver.oracle.OracleDriver",
      ".",
      "demo",
      "Tables",
      "Tables.scala"
    )),
    300.seconds
  ).onComplete{
    case Success(value) => println("Code Generation Done")
    case Failure(e) => e.printStackTrace
  }

}

В build.sbt есть следующие детали для Slick и Oracle Driver:

  "com.typesafe.slick"      %% "slick"                  % "3.1.1",
  "com.typesafe.slick"      %% "slick-codegen"          % "3.1.1",
  "com.typesafe.slick"      %% "slick-hikaricp"         % "3.1.1",
  "com.typesafe.slick"      %% "slick-extensions"       % "3.1.0",
  "com.hynnet"               % "oracle-driver-ojdbc"    % "12.1.0.2"

CustomCodeGenerator успешно генерирует код Slick, когда таблицы находятся в пользовательской схеме (user), но не когда таблицы находятся в другой схеме (как GEO выше). Может кто-нибудь предложить мне, как я могу получить гладкий код, сгенерированный для таблицы Oracle, когда таблица находится в разных схемах? Заранее спасибо за помощь.

1 ответ

Ниже приведен сликовый код для таблиц из выбранной схемы:

object CustomCodeGenerator extends  App {
  val url = "jdbc:oracle:thin:@//localhost:1521/xe"
  val jdbcDriver = "oracle.jdbc.OracleDriver"
  val userName = "user"
  val password = "password"
  val db = OracleDriver.api.Database.forURL(url, user = userName, password = password, driver = jdbcDriver)

  // filter out desired tables
  val requiredTables = Seq("br_fld", "fld_gm_sdo", "br_rep", "plt_gm_sdo")
  // filter out desired schema
  val requiredSchema = Seq("plot")
  val codegen = db.run {
    OracleDriver.defaultTables
      .map(_.filter(p => requiredTables.contains(p.name.name.toLowerCase) && requiredSchema.contains(p.name.schema.get.toLowerCase)))
      .flatMap(OracleDriver.createModelBuilder(_, false).buildModel)
  }
    .map { model =>
      new slick.codegen.SourceCodeGenerator(model) {
        override def entityName = dbTableName => dbTableName match {
          case _ => super.entityName(dbTableName)
        }
      }
    }

  Await.ready(
    codegen.map(_.writeToFile(
      "com.typesafe.slick.driver.oracle.OracleDriver", ".", "demo", "Tables", "Tables.scala")),
    300.seconds
  ).onComplete {
    case Success(value) => println("Code Generation Done")
    case Failure(e) => e.printStackTrace
  }
}
Другие вопросы по тегам