【问题标题】:Liquibase generated change log throws SQL Syntax ExceptionLiquibase 生成更改日志引发 SQL 语法异常
【发布时间】:2020-08-14 11:13:55
【问题描述】:

我使用 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;

【问题讨论】:

  • 您能分享一下您尝试运行的 liquibase 命令吗?
  • 我没有直接运行命令,liquibase 是在 pom 中导入的,但我认为它会是“liquibase migrate”?它正在使用主更改日志(添加到问题中)

标签: java mysql sql liquibase liquibase-sql


【解决方案1】:

尝试使用“updateSQL”命令从更改日志生成 sql,并检查生成的脚本是否有语法错误。

updateSQL 命令的文档链接 https://docs.liquibase.com/commands/community/updatesql.html

【讨论】:

  • 感谢您的建议!我刚刚发布了上面的解决方案
【解决方案2】:

所以最终我发现了问题所在。我在主日志(第一个更改集)中声明了 - sqlFile: 的地方是纯 SQL(不是更改集)。

Liquibase 生成一个 SQL 文件的地方,它用双连字符声明更改集参数(名称等) -- 并且没有空格。这不是有效的 SQL 注释,但它是有效的 Liquibase 格式。因此,Liquibase 生成的 SQL 失败了,而 yaml/xml 格式总是会失败,因为它们不是 SQL。

解决方案是使用 Liquibase 的 include: 标签声明文件,这样可以正确读取生成的 SQL。 Link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-29
    • 2020-02-16
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多