Quill способ сделать INSERT INTO ... ВЫБРАТЬ ИЗ - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь перевести простой запрос INSERT INTO...SELECT FROM в цитату из Quill.Прежде всего, мне не удается найти встроенный способ сделать это, поэтому я попытался использовать инфиксный запрос

val rawQuery = quote { (secondTableValues: List[Int]) => {
        infix"""
                INSERT INTO my_table (second_table_id)
                VALUES (
                  ${secondTableValues.map(stid => (SELECT id FROM second_table where id = $stid)).mkString(",")}}
                )
          """.as[Insert[Any]]
    }}

databaseClient.run(rawQuery(List(1,2,3)))

Это, однако, не компилируется, так как Quill не может собрать Ast длязапрос.

То, что я в итоге сделал, это необработанный запрос и не использовал кавычки и запустил его с executeAction.

Итак, два вопроса

  1. Как бы вы это сделали?INSERT INTO...SELECT FROM встроенным способом?
  2. Что не так с infix версией выше?

1 Ответ

1 голос
/ 26 сентября 2019
  import io.getquill._

  val ctx = new SqlMirrorContext(MirrorSqlDialect, Literal)

  import ctx._

  case class Table1(id: Int)

  case class Table2(id: Int, name: String)


  def contains(list: List[Int]) = {
    //SELECT e.id,'hello' FROM Table1 e WHERE e.id IN (?)
    val q = quote(
      query[Table1].filter(e => liftQuery(list).contains(e.id)).map(e => Table2(e.id, "hello"))
    )
    //insert into table2 SELECT e.id, 'hello' FROM Table1 e WHERE e.id IN (?)
    // `${..}` is expect ast , not string
    quote(infix"insert into table2 ${q}".as[Insert[Any]])
  }


  // test
  val list = List(1)
  ctx.run(contains(list))
...