【问题标题】:Scala Slick: cannot get parameters in queryScala Slick:无法在查询中获取参数
【发布时间】:2019-04-14 18:06:59
【问题描述】:

我刚刚在这上面花了几个小时。我试图通过 Scala 中的 Slick 在 PostgreSQL 中进行非常复杂的查询,但 Slick 永远不会考虑我的任何参数。如果我尝试以下简单的方法:

def get(location: String) = {
  val query = sql"select * from cities_v where name = $location limit 10"
  println(query.toString)
}

输出将是:

SQLActionBuilder(Vector(select * from cities_v where name = ? limit 10),<function2>)

如果相反,我尝试使用文字插入:

def get(location: String) = {
  val query = sql"select * from cities_v where name = #$location limit 10"
  println(query.toString)
}

输出将是:

SQLActionBuilder(Vector(select * from cities_v where name = , ville,  limit 10),<function2>

Slick 总是在任何文字参数周围添加逗号,无论它放在哪里,即使它是查询中的唯一参数,如:

sql"#$q"

现在,我想要进行更复杂的查询,在 Postgres 中进行计算和函数调用。但鉴于 Slick 不允许我使用我的任何变量,我无处可去。

我尝试设置各种隐式,一些扩展 GetResult 一些扩展 StatementParameters,Slick 似乎忽略了所有这些,要么用 ? 替换我的参数,要么用逗号包围它们,从而呈现我所有的查询无效。我想补充一点,#$ 不是很好,因为它不提供消毒。我想坚持使用 Slick,因为它是异步的,但我不知道从哪里开始。

这些是我的版本号,根据build.sbt

"postgresql"         %  "postgresql"           % "9.1-901-1.jdbc4",
"com.typesafe.slick" %  "slick_2.12"           % "3.2.3",

我做错了什么?

【问题讨论】:

    标签: scala jdbc slick jdbc-postgres


    【解决方案1】:

    ? 出现在您的结果语句中没有任何问题。就是parametrized query,每个?代表未来值的占位符。

    只需对任何数据库运行查询并检查结果。

    【讨论】:

    • 让我试试。与我想的不同,它似乎没有针对数据库运行。我采用了另一种解决方案,但我再次需要原始 SQL 语句,所以我会这样做并告诉你它是如何进行的。
    • 你完全正确。我只是不习惯 Slick 的工作方式。到目前为止,我发现 Slick 很棒,他们的文档很糟糕。这些文档真的(至少在我看来)很糟糕。但现在一切都解决了。感谢您的帮助!
    • 不客气。我建议你阅读 underscore.io 中的essential slick(我仍然在本书中使用ctrl+f 来刷新一些东西)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2021-03-16
    • 2012-10-17
    • 2018-11-04
    • 1970-01-01
    相关资源
    最近更新 更多