

VIEWの変更権限を持っていないデータベースからコード生成を行おうとしています。  
ドキュメントにはAPIをoverrideするように書いてありましたがやり方がわかりませんでした。

使用ライブラリのバージョン  
scala 2.11.6  
slick 3.0.3  
slick-codegen 3.0.3  
mysql-connector-java 5.1.36

ドキュメント  
<http://slick.typesafe.com/doc/3.0.3/code-generation.html#customization>

ドキュメントで紹介されているExample  
<https://github.com/slick/slick-codegen-customization-example>

ソースコードはこちらになります。

[code]

    def custom = {
      val slickDriver = "slick.driver.MySQLDriver"
      val jdbcDriver = "org.gjt.mm.mysql.Driver"
      val url = "jdbc:mysql://localhost/test?characterEncoding=UTF-8&amp;characterSetResults=UTF-8&amp;zeroDateTimeBehavior=convertToNull"
      val outputFolder = "src/main/scala"
      val pkg = "gen"
      val user = "userName"
      val pass = "password"
    
      val driver: JdbcProfile =
        Class.forName(slickDriver + "$").getField("MODULE$").get(null).asInstanceOf[JdbcProfile]
      val dbFactory = driver.api.Database
      val db = dbFactory.forURL(url, driver = jdbcDriver,
        user = Some(user).getOrElse(null), password = Some(pass).getOrElse(null), keepAliveConnection = true)
    
      try {
        val m = Await.result(db.run(driver.createModel(None, false)(ExecutionContext.global).withPinnedSession), Duration.Inf)
        new SourceCodeGenerator(m).writeToFile(slickDriver, outputFolder, pkg)
      } finally db.close
    }
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2015-10-07T05:45:35.850
17339
2017-01-14T14:26:40.803
12620
question
scala
Slick の Code-generation で View を除外したい


ソースを読んで解決しました。

MTable.getTables の引数に対象とするテーブルをフィルターする条件を指定します。

typesにはDatabaseMetaData.TableTypeのnameに定義されている値を利用できます。

[code]

    def custom = {
      val slickDriver = "slick.driver.MySQLDriver"
      val jdbcDriver = "org.gjt.mm.mysql.Driver"
      val url = "jdbc:mysql://localhost/test?characterEncoding=UTF-8&amp;characterSetResults=UTF-8&amp;zeroDateTimeBehavior=convertToNull"
      val outputFolder = "src/main/scala"
      val pkg = "gen"
      val user = "userName"
      val pass = "password"
    
      val driver: JdbcProfile =
        Class.forName(slickDriver + "$").getField("MODULE$").get(null).asInstanceOf[JdbcProfile]
      val dbFactory = driver.api.Database
      val db = dbFactory.forURL(url, driver = jdbcDriver,
        user = Some(user).getOrElse(null), password = Some(pass).getOrElse(null), keepAliveConnection = true)
    
      val tables = Some(MTable.getTables(Some(""), Some(""), None, Some(Seq("TABLE")))) //ここでフィルターできるようです。
      val modelAction = driver.createModel(tables, false)(ExecutionContext.global).withPinnedSession
      val modelFuture = db.run(modelAction)
      try {
        val m = Await.result(modelFuture, Duration.Inf)
        new SourceCodeGenerator(m).writeToFile(slickDriver, outputFolder, pkg)
      } finally db.close
    }
    
[/code]


CC BY-SA 3.0
2015-10-07T16:03:12.057
17383
2015-10-07T16:03:12.057
12620
17339
answer