【问题标题】:How to send plain SQL queries (and retrieve results) using scala slick 3如何使用 scala slick 3 发送普通 SQL 查询(并检索结果)
【发布时间】:2015-11-13 16:07:35
【问题描述】:

我正在尝试创建一个类,该类具有可以使用普通 sql 查询向 SQLite db 发送和获取数据的方法。不幸的是,这不起作用。我不想使用 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,Nothing] DBops.scala

【问题讨论】:

  • 问题是生成的代码会是select * from 'some_table'
  • 不知道我的回答是否有帮助,我是否正确理解了您的问题?
  • 答案很有帮助,但没有解决问题。但是我设法自己解决了。
  • 很高兴听到!我实际上并没有注意到类型中缺少 Seq :)

标签: sql sqlite scala slick


【解决方案1】:

您可以将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)

...有时您需要将文字值直接拼接到语句中,例如对表名进行抽象...您可以为此目的在所有插值器中使用#$而不是$...

【讨论】:

  • 不会把它当作用户输入,这只是后端,有什么方法可以不用预先定义列类型?
  • 你的意思是sql"select...".as[(String, Int)]?由于您正在编写 Scala,因此事先确定类型非常重要——这就是类型安全。基本上你可以使用任何“原始类型”的元组,或者你可以创建自己的implicitGetResult。阅读更多:slick.typesafe.com/doc/3.0.0/sql.html#result-sets Plus:我看不出有什么理由你不能创建一个GetResult,它会通过在结果集上调用rs.next来创建一个列表,但我找不到任何参考。
【解决方案2】:

我意识到我在返回类型中缺少 Seq:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2020-09-18
    • 2017-04-06
    • 2023-03-08
    • 2016-04-30
    • 2012-08-26
    相关资源
    最近更新 更多