我正在尝试将简单的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)))
来运行它。
有两个问题
executeAction
?INSERT INTO...SELECT FROM
版本有什么问题?答案 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))