插入到... SELECT FROM中的鹅毛笔方式

时间:2019-09-25 15:48:36

标签: scala quill.io

我正在尝试将简单的context查询转换为Quill中的引号。首先,我无法找到一种内置方法来执行此操作,因此最终尝试使用中缀查询

INSERT INTO...SELECT FROM

但是,由于Quill无法为查询构建Ast,因此无法编译。

我最终要做的是有一个原始查询,不使用引号,而使用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))) 来运行它。

有两个问题

  1. 您将如何以内置方式来executeAction
  2. 上述INSERT INTO...SELECT FROM版本有什么问题?

1 个答案:

答案 0 :(得分:2)

  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))