0

私が所有していないが選択権限を持つスキーマに存在するテーブルの 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 ドライバーに関する以下の詳細が含まれています。

  "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 は、テーブルがユーザー スキーマ (user) に存在する場合は Slick コードを正常に生成しますが、テーブルが他のスキーマ (上記の GEO など) に存在する場合は生成しません。テーブルが異なるスキーマに存在する場合、Oracleテーブル用に生成された洗練されたコードを取得するにはどうすればよいか教えてもらえますか? よろしくお願いします。

4

1 に答える 1

0

以下は、選択したスキーマからテーブルの洗練されたコードを生成します。

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
  }
}
于 2016-11-09T23:52:10.300 に答える