如何在Play框架中打印出填充了Anorm SQL语句的内容

5
如何使用Anorm打印出要运行的SQL状态。
示例:
SQL(s"SELECT $terms FROM $PERSON_TABLE WHERE name = {name}").on("name" -> "Bill")

打印出这个结果

SimpleSql(anorm.SqlQuery$$anon$1@1197b8ab,Map(name -> ParameterValue(Bill)),<function1>,false)

我希望能够看到在服务器上执行的确切查询。
SELECT id, name, state FROM person WHERE name = "Bill";

我不想像这样使用插值:


s"SELECT $terms FROM $PERSON_TABLE WHERE name = $name"

我需要能够看到所有转义字符以及用单引号包裹的内容和双引号包裹的内容。

使用:

Play 2.4.1-Scala

谢谢,

Adam


1
首先,您不应该在 SQL 语句中使用字符串插值,而是使用 Anorm 插值 SQL"SELECT #$terms FROM #$table WHERE name = $name",它使用简单的 $ 处理参数和纯连接符 #$(请参阅 Anorm 文档)。然后,Anorm 2.5.0 已经发布。 - cchantep
@cchantep 使用字符串插值有什么问题吗?我知道为了防止注入攻击,不要使用来自用户的内容进行插值,但是如果被插值的部分是我在代码中提供的内容,使用它是否有问题? - NarayanJr
为什么要使用标准的插值方法,它可以与一些预处理语句一起工作,而Anorm则始终可行? - cchantep
在2.4版本之前,可以通过配置针对bonecp的记录器来实现,但是bonecp已经被替换了。我还没有使用新的方法,但是这篇文章中有一个提示in this post - wwkudu
请查看此处的响应:https://dev59.com/zWox5IYBdhLWcg3wLhei - Alexandros Tzoumas
4个回答

2
您可以使用Acolyte(我的框架)提供的调试工具来进行调试。 点击此处 了解更多信息。
import acolyte.jdbc.AcolyteDSL

AcolyteDSL.debuging() { implicit con =>
  // debug any JDBC execution within

  SQL"SELECT * FROM Test WHERE id = $id"
  // Will print the stmt prepared for
}

有没有办法让它打印填好的语句?它会打印出带有“?”的语句,然后在值和类型后面列出它们。感谢您让我知道2.5.0版本。升级到该版本修复了我的一个问题,即查询被插值,然后顺序混乱。尽管如此,我仍然接受它,因为它解决了我的问题。谢谢。 - NarayanJr
Acolyte打印参数列表。对于每个?,只需考虑在相应位置指示的参数详细信息(名称+类型)。 - cchantep

0

0

尝试使用预处理语句:

val yourStmt = SQL(s"SELECT $terms FROM $PERSON_TABLE WHERE name = {name}").on("name" -> "Bill")
val pstmt = yourStmt.preparedStatement(con)
pstmt.foreach(p => println(p))

(在使用插值字符串的 anorm 2.5.0 中对我起作用)


使用字符串插值SQL(s"..")而不是Anorm插值SQL".."会引入SQL注入风险。 - cchantep
这个不起作用。"preparedStatement"需要的参数比连接更多。我不明白我应该把什么放到额外的参数中,因为整个方法似乎没有文档记录。 - Atte Juvonen

0

在标准的anorm API中,sql.getFilledStatement(connection, true)似乎运行得非常好


“getFilledStatement”似乎已经不存在了? - Atte Juvonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接