如何解决Liquibase生成的更改日志引发SQL语法异常
我已经使用Liquibase的generateChangeLog命令为现有数据库生成了更改日志。但是,当我尝试运行此命令时,将引发sqlSyntaxErrorException。
Caused by: java.sql.sqlSyntaxErrorException: You have an error in your sql Syntax; check the manual that corresponds to your MysqL server version for the right Syntax to use near 'databaseChangeLog:
- changeSet:
id: 1595846089000-1
author: A (gen' at line 1
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:120) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.MysqL.cj.jdbc.exceptions.sqlError.createsqlException(sqlError.java:97) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.MysqL.cj.jdbc.exceptions.sqlExceptionsMapping.translateException(sqlExceptionsMapping.java:122) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.MysqL.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:764) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.MysqL.cj.jdbc.StatementImpl.execute(StatementImpl.java:648) ~[mysql-connector-java-8.0.21.jar:8.0.21]
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-3.4.5.jar:na]
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-3.4.5.jar:na]
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:352) ~[liquibase-core-3.6.3.jar:na]
... 31 common frames omitted
更改日志
databaseChangeLog:
- changeSet:
id: 1595846089000-1
author: A123456 (generated)
changes:
- createTable:
columns:
- column:
constraints:
primaryKey: true
name: id
type: VARCHAR(36)
- column:
name: message
type: LONGTEXT
- column:
name: output
type: LONGTEXT
- column:
name: result
type: VARCHAR(16)
tableName: task
我尝试生成不同格式(xml,yaml,sql)的文件,但是即使语法有效,它们都失败并显示相同的错误。
我认为生成的日志字符集可能是一个问题,因此我尝试将以下内容添加到连接URL。
&useJvmCharsetConverters=true
看到this question后,我还确保文件为UTF-8(无bom)。
运行Liquibase 3.6.3
任何帮助将不胜感激!
编辑以添加主更改日志:
databaseChangeLog:
- changeSet:
id: 1
author: A123456
dbms: MysqL
labels: initial-migration
preConditions:
- onFail: MARK_RAN
- onError: MARK_RAN
- not:
tableExists:
schemaName: pd
tableName: task
changes:
- sqlFile:
path: initial-migration.yaml
relativetochangelogFile: true
Caused by: liquibase.exception.MigrationFailedException: Migration Failed for change set classpath:/db/changelog/db.changelog-master.yaml::1::A123456:
Reason: liquibase.exception.DatabaseException: You have an error in your sql Syntax;
解决方法
尝试使用“ updateSQL”命令从更改日志生成sql,并检查生成的脚本中是否存在语法错误。
updateSQL命令的文档链接 https://docs.liquibase.com/commands/community/updatesql.html
,所以最终我找出了问题所在。我在主日志(第一个变更集)中声明了- sqlFile:
的地方是在期待纯SQL(而不是变更集)。
在Liquibase生成SQL文件的地方,它声明带双连字符的更改集参数(名称等)-不能有空格。这不是有效的SQL注释,而是有效的Liquibase格式。因此,Liquibase生成的SQL失败,并且yaml / xml格式始终会失败,因为它们不是SQL。
解决方案是改为使用Liquibase的include:
标签声明文件,这样可以正确读取生成的SQL。 Link
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。