LoginSignup
0
0

More than 5 years have passed since last update.

初めてのScalaでDBアクセスをした。

Posted at

2016/11/26(土)に、
株式会社セプテーニ・オリジナル様のScalaもくもく会に参加させて頂きました。
遅れ馳せながら、そのときに実施したことのメモです。

環境

  • MacBook Pro (Retina 13-inch、Early 2015)
  • OS X El Capitan 10.11.6
  • Java 1.8.0_102
  • IntelliJ IDEA CE 2016.3

実施したこと

引数で受け取った文字列を、インメモリデータベースにINSERTし、
インメモリデータベースのSELECT結果をコンソール出力する、という、
簡単なものを作成しました。

はまったこと

  • Intelli Jから実行するとき、"main method should be static"が出る
    • 「HelloWorld.scala$」ではなく、「HelloWorld.scala」を指定して実行する
    • 「HelloWorld.scala$」をラップしたのが「HelloWorld.scala」であるらしい。
  • Intelli Jでsbtプロジェクトを作成した際、「New ->」に「Scala Class」が出てこない
    • ビルド中・ライブラリダウンロード中だった
    • 「src -> main -> scala」配下を選択中でないと出てこない
  • そもそも、H2のインメモリDBの使い方がわからない
    • sbtによってダウンロードされたJARを起動して、H2のインメモリファイルを作成
    • 「.ivy2」ディレクトリ配下に、実体はまとめられているらしい
    • Mavenの「.m2/repository」のようなもの?
  • ブラウザからH2のDBファイルに、テーブルを作成したにも関わらず、アプリケーションからはアクセスできない
    • ファイル参照方法を間違えていた…
  • Scalaは++、--ができない
    • i += 1とかやる必要があるらしい
  • ListにAddできない
    • ScalaのListがイミュータブルであるため
    • 再生成する必要あり
    • >> Scalaをはじめとする関数型プログラミングでは、List(コレクション)に要素を追加する必要がある場合、そのロジックがおかしいのではないかと疑ってください。 コレクションは基本的にImmutable(不変)であるべきです。 https://teratail.com/questions/7560
  • テーブルへの動的なINSERT文の発行方法がわからない
    • 以下が発生
    • Error:(40, 106) could not find implicit value for parameter session: scalikejdbc.DBSession sql"insert into members (name, created_at) values (${userDto.name}, current_date())".update.apply()
    • Error:(40, 106) not enough arguments for method apply: (implicit session: scalikejdbc.DBSession)Int in class SQLUpdate. Unspecified value parameter session. sql"insert into members (name, created_at) values (${userDto.name}, current_date())".update.apply()
    • DB autoCommit { implicit session =>とせず、sql"insert intoと書き始めていた
  • INSERT文発行時にConnection pool is not yet initialized.(name:'default)が発生する
    • 一度DBs.setupAll()やったら、CloseまでConnectしているイメージだったが、そうではないらしい
  • コンストラクタに書いたメソッドが、別クラスのフィールドでNew ClassAと書くと、実行されないらしい
    • コンストラクタの書き方が間違っていた。def ClassA(): Unit = {}と書いてしまうと、ClassAというメソッド になってしまう
  • SELECT文の結果を、プレーンなテキストで出力することができず、「Some(a)」と出力されてしまう。
    • asInstanceOf[Some[String]でキャストして、Some#flattenを使用する
    • Error:(30, 72) Cannot prove that String <:< Option[B].が発生
    • そもそも、ScalikeJDBCを使用し、SELECT結果をANYで受け取るのが間違い、と考えられる
    • scalikejdbc.SQLSyntaxSupportクラスを継承した、取得結果を格納するDTOを作成する
  • SQLが読みにくい
  • SQLSyntaxSupportを使ったクラスで、tableNameなどをOverrideすることができない
    • valが必要だった
  • val m = MemberDto.syntax("m") val members = withSQL { select.from(MemberDto as m) }.map(MemberDto(m)).list.apply()がコンパイルエラーになる
    • MemberDtoapply(SyntaxProvider)(WrappedResultSet)apply(MemberDto)(WrappedResultSet)を実装していなかった
    • sessionがなかった
  • scalikejdbc.InvalidColumnNameExceptionが発生する
    • タイポ
    • フィールド名:create_id
    • apply:created_at
    • テーブル名:created_at

結果

Scala+ScalikeJDBCを使用し、
DBアクセスするコンソールアプリケーションを作成することができました。
https://github.com/naokiur/Scala-sandbox/tree/master/src/main

参考にさせて頂きました

http://scalikejdbc.org/documentation/query-dsl.html
https://github.com/scalikejdbc/scalikejdbc-cookbook/blob/master/ja/02_quicktour.md
https://github.com/scalikejdbc/scalikejdbc-cookbook/blob/master/ja/05_sql_template.md
https://www.jetbrains.com/help/idea/2016.3/debug-tool-window-watches.html
https://dwango.github.io/scala_text/trait.html
http://www.h2database.com/html/functions.html#current_date
http://tech.furyu.jp/blog/?p=3078
http://www.walbrix.com/spring-scala/src/examples/scala/com/walbrix/spring/ProductRequestHandler.scala

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0