2016-10-18 6 views
0

Ich habe eine Verpflichtung, die nicht von mir Besitz für die Tabellen in Schema Slick benutzerdefinierten Code zu generieren, sondern mit ihnen wählen Privilegien. Der Code Ich verwende ist:Code generiert Slick Codegen 3.1.1 für mehr Schema

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 
    } 

}

Die build.sbt unten Details für Slick und Oracle-Treiber hat:

"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 erzeugt den Slick-Code erfolgreich, wenn die Tabellen befinden sich in Benutzerschema (Benutzer), aber nicht, wenn sich die Tabellen in einem anderen Schema befinden (wie GEO oben). Kann mir jemand vorschlagen, wie ich den für Oracle-Tabellen generierten Slick-Code bekommen kann, wenn sich die Tabelle in verschiedenen Schemas befindet? Vielen Dank im Voraus für Ihre Hilfe.

Antwort

0

Die unter einem erzeugten Slick-Code für Tabellen aus dem gewählten Schema:

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 
    } 
} 
Verwandte Themen