Slick:Insert 从 Raw SQL Select 变成 Table

Slick:Insert into a Table from Raw SQL Select

从 Raw SQL Select

插入 Table
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 中的数据插入表中? 如果没有,有没有办法使用 forceInsertStatements 生成 sql 字符串? 类似于:

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

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

如果您可以将 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(没有 round-trip 到数据库)因为原始 SQL 已经是一个动作(不是查询)。

但是,既然您使用的是原始 SQL,为什么不全部使用原始 SQL?类似于:

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

...或类似的。