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() } } }