【问题标题】:How can I view the SQL generated by Anorm?如何查看 Anorm 生成的 SQL?
【发布时间】:2015-04-21 22:25:38
【问题描述】:

我正在尝试用 anorm 执行一些插入语句,然后返回 LAST_INSERT_ID() 的值。但我收到一条错误消息,提示我的 SQL 语法无效。

谁能告诉我如何检查并查看发送给 MySQL 的最终生成的 SQL 是什么样的?

【问题讨论】:

  • 异常未生成 SQL。它准备参数,例如java.sql.PreparedStatement。您可以通过将传递给SQL(...)的字符串复制并手动将参数占位符替换为测试值来检查SQL语句,因此您可以手动执行该语句。
  • 也就是说,祝您使用 Anorm 测试您的应用程序好运...

标签: scala anorm


【解决方案1】:

Anorm 不会真正生成 SQL,但你会。但是有一种方法可以记录通过线路发送到控制台的确切查询(在准备好语句之后,假设您在 Play 中使用 Anorm)。

假设您使用一个名为 default 的数据库(默认配置),请将以下内容添加到您的 application.conf

 db.default.logStatements=true

然后你可以将以下内容保存到conf/logger.xml

<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-5level - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.jolbox.bonecp" level="NONE">
        <appender-ref ref="STDOUT" />
    </logger>

    <logger name="play" level="INFO">
        <appender-ref ref="STDOUT" />
    </logger>

    <logger name="application" level="NONE">
        <appender-ref ref="STDOUT" />
    </logger> 

</configuration>

文件中的关键行与 BoneCP 日志记录有关,但我们想为应用程序和播放记录器添加行,所以我们不会弄乱默认的日志记录。

【讨论】:

  • 在当前异常版本中应该是“db.default.logSql = true”(播放2.5)
【解决方案2】:

没有任何登录 Anorm 很糟糕。

如果您生成的 SQL 无效并且您的驱动程序出现了神秘的异常,那么我建议您在此处设置断点 (anorm.SimpleSql):

def preparedStatement(connection: Connection, getGeneratedKeys: Boolean = false) = {
implicit val res = StatementResource
resource.managed {
  val (psql, vs): (String, Seq[(Int, ParameterValue)]) = Sql.prepareQuery(sql.stmt.tokens, sql.paramsInitialOrder, params, 0, new StringBuilder(), List.empty[(Int, ParameterValue)]).get

  val stmt = if (getGeneratedKeys) connection.prepareStatement(psql, java.sql.Statement.RETURN_GENERATED_KEYS) else connection.prepareStatement(psql)

  sql.timeout.foreach(stmt.setQueryTimeout(_))

  vs foreach { case (i, v) => v.set(stmt, i + 1) }

  stmt
}

并记录psql

【讨论】:

  • 最近我了解了 -Dscala.control.noTraceSuppression=true 如果你想从异常中获取堆栈跟踪
猜你喜欢
  • 2014-02-21
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多