LoginSignup
1
0

More than 3 years have passed since last update.

Quillでテーブル名に定数を使う方法

Last updated at Posted at 2020-11-08

2021/05/25

コンパイルできない問題を回避する方法が見つかりました
doc コマンドを使用しないように設定すればdistが通ります(dist内部でdocを呼んでいるのが問題でした)

# 注意(2020/12/13)
この方法を使用すると、play frameworkのdistやsbt-native-packagerでjarが生成できなくなります。(compileコマンドは普通に通りますが、distを行うとコンパイルエラーが出ます)
Quillまたはsbtの制限もしくはバグかもしれません。
回避するためにはベタ書きするしかありません。

はじめに

Quill でテーブル名に定数を使用しようとしたときにハマったのでメモとして残しておく。

動かないコード

一度しか使わないものや書き散らす場合を除き、テーブル名はいろいろな箇所で使用するため定数として定義しておくことが望ましい。

そこで以下のように定数を使用してみた。

import java.util.UUID

import io.getquill._

object Scalab {

  def main(args: Array[String]): Unit = {
    val ctx = new PostgresJdbcContext(LowerCase, "dataSource")
    import ctx._

    val sample = quote { querySchema[Sample](Schema.SampleTable) }

    println(run(quote { sample }))
  }

}

object Schema {
  val SampleTable = "Sample"
}

case class Sample(id: UUID, name: String, age: Int)

一見正しそうに見えるが、コンパイルすると以下のようなエラーが出る。

[error] {PATH TO FILE}: Tree 'ctx.querySchema[Sample](Schema.SampleTable)' can't be parsed to 'Ast'
[error]     val sample = quote { querySchema[Sample](Schema.SampleTable) }

動くコード

ごく普通の要求なので絶対に解決策があると思い調べてみたらヒントらしきissueが挙がっていた。
Unable to use constant directly defined in object

つまり以下のようにすればコンパイルでき想定通りにコードが動く。

object Schema {
  final val SampleTable = "Sample"
}
1
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
1
0