如何使用 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)])
}
我正在尝试制作一个 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)])
}