Slick 3.1.0でのCodeGenerator(joda-timeサポート付き)

自分が前に開発したプロジェクトでslickのバージョンが2系を 利用していたのでslick 3系にアップロードした際に CodeGeneratorの書き方が変わっていたので、そのメモです。

slick 2の場合

import com.typesafe.config.{ Config, ConfigFactory }
import scala.slick.{ model => m }
import scala.slick.codegen.SourceCodeGenerator
import scala.slick.driver.JdbcProfile

class CustomSourceCodeGenerator(model: m.Model) extends SourceCodeGenerator(model) {

    override def code = "import com.github.tototoshi.slick.MySQLJodaSupport._\n" + "import org.joda.time.DateTime\n" + super.code

    override def Table = new Table(_) {
      override def Column = new Column(_) {
            override def rawType = model.tpe match {
                case "java.sql.Timestamp" => "DateTime"
                case _ => {
                    super.rawType
                }
            }
        }
    }
}

object CodeGen {

    def main(args: Array[String]) {

        val config: Config = ConfigFactory.load()
        val slickDriver = "scala.slick.driver.MySQLDriver"
        val jdbcDriver = config.getString("db.default.driver")
        val url = config.getString("db.default.url")
        val user = config.getString("db.default.user")
        val outputFolder = "lib/src/main/scala/"
        val pkg = "dilaton.lib"

        val driver: JdbcProfile = scala.slick.driver.MySQLDriver

        val db = {
            driver.simple.Database.forURL(url, driver = jdbcDriver, user = user)
        }

        db.withSession { implicit session =>
            new CustomSourceCodeGenerator(driver.createModel()).writeToFile(slickDriver, outputFolder, pkg)
        }
    }
}

slick 3の場合

import slick.codegen.SourceCodeGenerator
import slick.driver.JdbcProfile
import scala.concurrent.ExecutionContext.Implicits.global

object CodeGenMySQL {

    def main(args: Array[String]) {
        val driver: JdbcProfile = slick.driver.MySQLDriver

        val db = InfrastructureDao.MySQLClient().db

        val modelAction = driver.createModel(Some(driver.defaultTables))
        val modelFuture = db.run(modelAction)
        val codeGenFuture = modelFuture.map(model => new SourceCodeGenerator(model) {
            override def code = "import com.github.tototoshi.slick.PostgresJodaSupport._\n" + "import org.joda.time.DateTime\n" + super.code

            override def Table = new Table(_) {
                override def Column = new Column(_) {
                    override def rawType = model.tpe match {
                        case "java.sql.Timestamp" => "DateTime" // kill j.s.Timestamp
                        case _ => {
                            super.rawType
                        }
                    }
                }
            }
        })

        codeGenFuture.onSuccess {
            case codeGen =>
                codeGen.writeToFile(
                    "slick.driver.MySQLDriver", "lib/src/main/scala/", "test.lib", "MySQLTables", "MySQLTables.scala"
                )
        }
        codeGenFuture.onFailure {
            case e =>
                println("error")
                e.printStackTrace()
        }
    }
}