如何使用 scala slick 3 发送纯 SQL 查询(并检索结果)

How to send plain SQL queries (and retrieve results) using scala slick 3

我正在尝试制作一个 class,它具有可以使用普通 sql 查询向 SQLite 数据库发送和获取数据的方法。不幸的是,这不起作用。我不想使用 withSession 隐式部分。

import slick.driver.SQLiteDriver.api._
import slick.lifted.TableQuery
import slick.jdbc.JdbcBackend.Database;
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import ExecutionContext.Implicits.global

    class DBops {
  val db = Database.forURL("jdbc:sqlite:S:/testing/testdb.sql",driver = "org.sqlite.JDBC")

def getData(TableName: String):Future[(Int,Double,String)]={
    db.run(sql"""select * from $TableName """.as[(Int,Double,String)])

}

}

抛出以下错误:

类型不匹配;发现:slick.profile.SqlStreamingAction[Vector[(Int, Double, String)],(Int, Double, String),slick.dbio.Effect] 需要:slick.dbio.DBIOAction[(Int, Double, String),slick.dbio.NoStream,无] DBops.scala

您可以将 sql"..." 与任何 String 内容一起使用 #$tableName:

db.run(sql"SELECT * FROM #$tableName".as[(Int, Double, String)])

请记住:永远不要将 tableName 作为用户输入 - 否则,SQL 注入的风险很大。普通的$value为您解决这些问题

阅读 Slick 手册(http://slick.typesafe.com/doc/3.0.0/sql.html#splicing-literal-values

... sometimes you need to splice literal values directly into the statement, for example to abstract over table names ... You can use #$ instead of $ in all interpolators for this purpose ...

我意识到我在 return 类型中缺少一个序列:

def getData(TableName: String): Future[Seq[(Int,Double,String)]] = {
  db.run(sql"""SELECT * FROM $TableName """.as[(Int, Double, String)])
}