squeryl2scalikejdbc の設計構想

一気に作りあげようとしたのだけれど、結構面倒な問題に遭遇したので、一旦自分の考えをメモしてみるだけのなにか。
アドバイス募集。
追記:
seratch さんからコメントもらったので参照するといいよ

続き書いたよ squeryl2scalikejdbc作り始めた


最終目的

  • squeryl2scalikejdbcというsbtpluginつくる
  • 一番シンプルな使い方としては
    • sbt consoleからorg.squeryl.Schemaを継承したクラスの名前を指定
    • すべてのモデルのscalikejdbc用のmapperのコードを生成
  • 色々モデル毎に生成するメソッドを細かく制御できるようにする


前提条件とか詳しいモチベーションなど

  • すでにSqueryl使ってて、モデルのcase classの定義は存在してる
  • squerylとscalikejdbcを併用していきたいが、scalikejdbc用のmapperを全部手で書くの面倒だし、ミス発生しそう
  • scalikejdbc-mapper-generatorは現状のversion 1.5.1 ではデータベースから情報を取得きて、それを元にコード生成する
  • 「squerylを使ったモデルのcase class(を変更したりする) → databaseにcreate tableとかalter table発行 → scalikejdbc用のmapperを生成」という手順は、不可能ではない
  • が、データベース介さずにsquerylが保持しているメタ情報から直接コード生成したい
  • 介したくないというか、そもそもすでにcase classが存在するので、(データベースのカラム名はmappingできても)case classのfield名が、必ずしもカラム名をCamelCaseにしたものとは限らないので、「squerylが保持しているメタ情報から生成」のほうが明らかに望ましい
  • 単にscalikejdbc-mapper-generatorを使うと、必要ない部分が多いという理由もあるので、生成されるコードを色々カスタマイズもしたい
  • scalikejdbc-mapper-generatorはsbt pluginなので2.9.2でビルドされてる
  • 使いたいプロジェクトのScalaのversionは2.10である
  • なので、scalikejdbc-mapper-generatorをlibraryDependencyに加えられない

で、その回避策として、迷ってる案が現在2つあって



scalikejdbc-mapper-generatorのSbtKeys.scalaとSbtPlugin.scala
https://github.com/seratch/scalikejdbc/blob/1.5.1/scalikejdbc-mapper-generator/src/main/scala/scalikejdbc/mapper/SbtPlugin.scala
https://github.com/seratch/scalikejdbc/blob/1.5.1/scalikejdbc-mapper-generator/src/main/scala/scalikejdbc/mapper/SbtKeys.scala
以外のほとんどの部分をコピペしてきて、改変しつつ、独自に(マルチプロジェクトの)plugin作る。マルチプロジェクトというのは、

  • squeryl2scalikejdbc-core (Scala2.10で作る。これ自体はsbt-pluginではない。scalikejdbc-mapper-generatorからコピペしてきたものと、その他少しだけ自分で書いたもの)
  • squeryl2scalikejdbc-plugin (sbt-pluginとしてScala2.9で作る。squeryl2scalikejdbc-coreを呼び出すTaskなどを定義するだけのもの)

という感じになるはず



もう一つの案は、
scalikejdbc-mapper-generatorには依存しつつ、scala2.9とscala2.10のデータを受け渡す部分をJavaで書く or 一旦何らかの汎用的な*1フォーマットでファイルに書き出して受け渡す

*1:Scalaのversionに依存しない、jsonとかxmlとかなにか