【问题标题】:Printing interpolated SQL query in Slick在 Slick 中打印插值 SQL 查询
【发布时间】:2016-01-23 07:11:52
【问题描述】:

我正在尝试打印插入的 Slick2 SQL 语句以进行调试,但我得到的只是带有问号的语句,例如

def query(name: String) = sql"SELECT MAX(age) FROM users WHERE name = $name".as[Int]
println(query("Bob").getStatement)   

上面打印了这个:

SELECT MAX(age) FROM users WHERE name = ?

我怎样才能让它打印出来:

SELECT MAX(age) FROM users WHERE name = 'Bob'

注意:这个问题不是this的重复问题

【问题讨论】:

  • 您试图解决的问题与 slick 并不严格相关:slick 在 JDBC 级别创建准备好的语句,并以这种方式打印。我怀疑您应该研究如何打印 JDBC 准备好的语句,而不是将注意力集中在 slick 上。我不确定在 JDBC 中有没有办法做到这一点。

标签: scala jdbc prepared-statement slick slick-2.0


【解决方案1】:

您可能希望将以下内容添加到您的 application.conf 中

logger.scala.slick.session=DEBUG

这应该会在控制台中显示已编译的查询字符串。

【讨论】:

  • 我有一个 Play 应用。我将它添加到我的 application.conf 并将它添加到我的 logger.xml:<logger name="scala.slick.session" level="INFO"/> 但是,我没有看到它...
  • 在 logger.xml 中将日志级别更改为“DEBUG”会发生什么?
  • 相同。我也降级为DEBUG。没有。我正在使用 Slick 2.0 + Play 2.2
  • 您可以编辑以显示您的 application.conf 和 logger.xml 的样子吗?我敢肯定,您只是获取日志的一个参数。同时,试试<logger name="slick.jdbc" level="DEBUG"/>
【解决方案2】:

来自精巧的documentation:“您可以使用#$ 而不是$ 将文字值直接插入到查询中”。

//note the '#'
def query(name : String) = sql"SELECT MAX(age) FROM users WHERE name = '#$name'".as[Int]

【讨论】:

  • 不,我不想要#$,因为那是为了拼接部分 SQL 语句本身(例如表名等)。这会产生不正确的 SQL,因为它会执行 where name=Bob 而不是 where name='Bob'。我希望$ 绑定变量...
  • 这也不适用于非原语例如:def query(birthdate : LocalDate) = sql"SELECT MAX(age) FROM users WHERE birthday > $birthdate".as[Int] 这里如果我有正确的隐式范围,它将转换为正确的 SQL 绑定变量。如果我使用#$,它只会放置我可能不想要的LocalDate.toString
  • 我在查询中添加了单引号以生成正确的 sql。我不知道您希望 println 为“非原始”显示什么,因为这些是唯一可以进入 sql 查询的值类型...
  • 如果你想要非默认行为,那么为什么不先构造字符串,然后将 sql 函数应用于构造的字符串呢?为什么让 sql 作为你的正则表达式求值器?
  • 不确定“sql 充当正则表达式求值器”是什么意思。 Slick 让您使用 type mapper 绑定自定义类,只能使用 $ 插值器而不是 #$ 插值器正确绑定。
猜你喜欢
  • 1970-01-01
  • 2015-02-04
  • 2016-01-12
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 2021-01-13
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多