sql模式导致SQL生产环境执行失败
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql模式导致SQL生产环境执行失败相关的知识,希望对你有一定的参考价值。
参考技术A 一.问题背景测试环境测试SQL没有问题,但是上生产环境之后,sql执行报错
二.现象
生产环境:点击‘一键还款确认’按钮,显示‘发起还款确认失败’。监控系统发送邮件抱错‘BadSqlGrammarException’,
Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'malm.t.buy_back_date'; this is incompatible with sql_mode=only_full_group_by ### The error may exist in class path resource [mybatis/financial/customized/BuybackDao.xml] ### The error may involve
三.分析
查询的SQL为:
select
sum(a.advance_amount) as advanceSumAmount,
COUNT(1) as countNum,
sum(a.expected_principal_amount) as expectedPrincipalAmount,
sum(a.expected_interest_amount) as expectedInterestAmount,
sum(a.expected_fine_amount) as expectedFineAmount,
sum(a.expected_service_amount) as expectedServiceAmount,
a.pay_date as payDate
from tb_loan_prepayment a
where a.capital_id = 2
AND a.STATUS = 5
AND a.pay_date BETWEEN '2017-10-27' AND '2017-10-27 23:59:59';
该sql在测试环境运行时没有报错的,并且能够正确地返回结果。那为什么到了生产环境就不能执行呢?原因在于两个环境使用的SQL_Mode不同。
sql模式定义了MySQL应支持的SQL语法,以及应该在数据上执行何种确认检查。 我们可以使用 select @@sql_mode; 来查看mysql使用的模式。
以下为测试环境的执行结果(STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION)
以下为生产环境的执行结果(ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION)其中,ONLY_FULL_GROUP_B
Y就是导致以上现象的问题所在。其限制为:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。
四.解决:
方法1)在应用中修改sql语法问题,添加GROUP BY条件。
方法2)将生产环境的sql模式同步到测试环境。同步以后保证两个环境无差异,可以有效防止其他同事或其他sql限制造成该问题
如何强制 sql-maven-plugin 忽略失败的 sql
【中文标题】如何强制 sql-maven-plugin 忽略失败的 sql【英文标题】:How to force sql-maven-plugin to ignore failling sqls 【发布时间】:2015-02-11 09:36:32 【问题描述】:我有一个构建,它从测试环境复制模式(创建 sql)并在本地数据库上执行(使用 sql-maven-plugin)那些 sql。问题是一些视图,存储过程在测试环境中被破坏。我需要忽略损坏的 sql(有错误的视图等)并继续构建。我需要动态地执行此操作,例如我们有 sqls A、B、C 和 A sql 已损坏,我不想让整个构建失败,但添加一些警告并执行下一个 sqls B、C .. 直到结束。
这可能吗?有任何想法吗?解决方法?
【问题讨论】:
【参考方案1】:终于找到了……
link to documentation
onError:
Action to perform if an error is found. Possible values are abort and continue.
Type: java.lang.String
Since: 1.0
Required: No
Expression: $onError
Default: abort
我添加到配置中:
<configuration>
(...)
<onError>continue</onError>
</configuration>
【讨论】:
以上是关于sql模式导致SQL生产环境执行失败的主要内容,如果未能解决你的问题,请参考以下文章