クリトラのコツコツITログ

3Dの皮をかぶった庶民の技術ブログです

SlickとMySQLの日付型再び & もうちょっとシンプルに対応

本日の配信


Scala-Play ハンズオン作成part7 ~ 改めてslickのdatetimeと闘うの巻 ~

本日は一旦SlickとMySQLの日付型マッピングに戻りました。
先日調整したものがあまりにもよくわからなかったのとシンプルさに欠けていたのが主な理由です。

もう少しシンプルな方法で対応をしつつ、なんでエラーになるのか処理を追ってみました

本日の進捗と残タスク

進捗

  • 日付型のマッピングを別方法で対応完了
  • ある程度エラーの原因を特定

Commit Log

Mapping解説
  val id:        Rep[Long]   = column[Long]  ("id",      O.AutoInc, O.PrimaryKey)
  val content:   Rep[String] = column[String]("content", O.Length(120,varying=true))
  val postedAt:  Rep[String] = column[String]("posted_at")
  val createdAt: Rep[String] = column[String]("created_at")
  val updatedAt: Rep[String] = column[String]("updated_at")

まずマッピングを一度Stringに戻して、文字列で受け取るようにしています。
これでこちら側の管理下に入る前にエラーで落ちることを回避しているつもりです。

  def * = (id, content, postedAt, createdAt, updatedAt) <> (
    (x: (Long, String, String, String, String)) => {
      Tweet(x._1, x._2, LocalDateTime.parse(x._3, format), LocalDateTime.parse(x._4, format), LocalDateTime.parse(x._5, format))
    },
    (tweet: Tweet) => {
      Some(tweet.id, tweet.content, tweet.postedAt.toString, tweet.createdAt.toString, tweet.updatedAt.toString)
    })

次にモデルとのマッピング、モデルからSlick用のタプルへの変換を自分で処理するようにしています。
created_at, updated_atなどは基本的に全てのテーブルにあるので全部これを書くのはいささか面倒という気持ちは脱ぎいきれませんが、変なことをするくらいであればこちらの方がよっぽどシンプルで良いのかな、という気がしています。

本気で作り込めばもう少し楽にできるのかもしれませんが、今はこれで十分(っつぅか限界

エラー補足
  // LocalDateTimeにマッピングしようとするときに以下の場所(slick.jdbc.MySQLProfile)で落ちてる。iso8601では少数の桁数を定義してない
  // override def getValue(r: ResultSet, idx: Int) : LocalDateTime = {
  //      r.getString(idx) match {
  //        case null => null
  //        case iso8601String => LocalDateTime.parse(iso8601String)
  //      }
  //    }

このコメントアウトの部分まんまですが、ここで落ちてるっぽいです(予想)
ResultSetから文字列で取得するまでは良い気がするのですが、parseするときに少数以下が文字列で入ってきてエラーになってるんだと思います。

iso8601はどうも厳密には小数点以下の精度が決められていないみたいでした
本当に簡単に調べた範囲ではありますがmysql, postgresは6桁までの精度を持っていて、oracle, db2あたりは9桁の精度で格納できそうでした
java.time.LocalDateTimeは9桁までの精度は対応できており、10桁以上はエラーになるようです

これって、そもそもバグに近いようなエラーだと思うのですが、どうしようもないんですかね?

残タスク

  • Lesson1の全て

今のところはlesson1を作ることように優先順位を変更しているので、優先度を考慮すると今日は進捗が0で残タスクは変わらずということになりました。

本日の反省

よかった点

  • 声は比較的聞きやすくなった、気がする
  • なんか画面がいつもより綺麗??
  • vimである程度奥の処理も追えるようになってきた

悪かった点

  • 配信直後に全然関係ないzsh + tmuxの不具合でエラーになっちゃった
    • brew upgradeを手癖のように毎日実行してるのがよくなかった...

まとめ

今回はいろいろと調べ物中心でしたが個人的には楽しく調べるものができました。
やはり私はフィーリングでプログラミングしているなぁという気持ちになりました。

f:id:christina_triceps:20200219015750p:plain