#oracle #scala #slick #slick-3.0 #slick-codegen
#Oracle #scala #slick #slick-3.0 #slick-codegen
Вопрос:
У меня есть требование генерировать 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
}
}
Сборка.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 успешно генерирует Slick code, когда таблицы находятся в пользовательской схеме (user), но не когда таблицы находятся в другой схеме (например, GEO выше). Может кто-нибудь подсказать мне, как я могу получить сгенерированный slick код для таблицы 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) amp;amp; 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
}
}