如何查看Anorm生成的SQL?

时间:2015-04-21 22:25:38

标签: scala anorm

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

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

2 个答案:

答案 0 :(得分: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日志记录有关,但我们也希望为应用程序添加行并播放记录器,因此我们不会弄乱默认日志记录。

答案 1 :(得分:0)

在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