我正在尝试执行一些插入语句,然后返回LAST_INSERT_ID()
的值。但是我收到一条错误,说我的SQL语法无效。
有谁能告诉我如何检查并查看MySQL发送的最终生成的SQL是什么样的?
答案 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