0

从原始 SQL 选择插入表

val rawSql: DBIO[Vector[(String, String)]] = sql"SELECT id, name FROM SomeTable".as[(String, String)]
val myTable :TableQuery[MyClass] // with columns id (String), name(String) and some other columns

有没有办法使用forceInsert函数将 select 中的数据插入表中?如果没有,有没有办法通过使用生成 sql 字符串forceInsertStatements?就像是:

db.run {
   myTable.map{ t => (t.id, t.name)}.forceInsert????(rawSql)
}

PS 我不想进行两次 I/O 调用,因为我的 RAW SQL 可能会返回数千条记录。谢谢您的帮助。

4

1 回答 1

0

如果您可以将rawSql查询表示为 Slick 查询...

val query = someTable.map(row => (row.id, row.name))

...例如,然后forceInsertQuery会做你需要的。一个例子可能是:

  val action =
     myTable.map(row => (row.someId, row.someName))
      .forceInsertQuery(
        someTable.map(query)
      )

但是,我认为您使用原始 SQL 是有充分理由的。在这种情况下,我不相信您可以使用 forceInsert (无需往返数据库),因为原始 SQL 已经是一个操作(不是查询)。

但是,当您使用原始 SQL 时,为什么不使用原始 SQL 来完成整个事情呢?就像是:

 val rawEverything = 
  sqlu" insert into mytable (someId, someName) select id, name from sometable "

...或类似的。

于 2020-08-24T14:03:21.570 回答