首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Slick Codegen 3.1.1为多个模式生成代码

使用Slick Codegen 3.1.1为多个模式生成代码
EN

Stack Overflow用户
提问于 2016-10-19 05:54:34
回答 1查看 458关注 0票数 0

我需要为模式中存在的表生成灵活的自定义代码,这些表不归我所有,但具有对它们的select权限。我使用的代码是:

代码语言:javascript
复制
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驱动程序的以下详细信息:

代码语言:javascript
复制
  "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"

当表驻留在用户模式( user )中时,CustomCodeGenerator会成功地生成平滑的代码,但当表驻留在其他模式(如上面的GEO )中时,就不会成功地生成平滑代码。有人能建议我,当Oracle表驻留在不同的模式中时,如何才能获得为该表生成的灵活代码?提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-11-10 07:52:10

下面的代码为所选模式中的表生成了巧妙的代码:

代码语言:javascript
复制
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
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40118751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档