当前位置: 首页 > 知识库问答 >
问题:

Liquibase不是在MySQL/MariaDB上执行SQL,而是在Spring Boot中执行H2

胡弘毅
2023-03-14

版本
Liquibase:3.6.2
Spring Boot:2.1.0.RELEASE MySQL / MariaDB:
mysql Ver 15.1 Distrib 10.1.25-MariaDB,用于Win32(AMD64)
H2:1.4.197

目标

我有一个迁移脚本,它将数据从两个表转换为一个。该脚本是用SQL编写的,并且工作正常(通过手动执行来验证)。此外,当使用H2数据库运行迁移时,它工作正常。

问题

当我切换到MySQL/MariaDB时,数据没有像脚本中定义的那样插入。但是,根据数据库交换日志表,脚本运行正常:

004.transform_translatable_data     vetemi  classpath:db/changelogs/0004.transfrom_translatabl...   2018-12-07 16:26:14     68  EXECUTED    8:3dc05e2db0d93de8ce10de09612dd2c0  sqlFile         NULL    3.6.2   NULL    NULL    4196374083

运行应用程序(日志文件)时也没有错误:

2018-12-07 16:26:14.880  INFO 13628 --- [           main] liquibase.changelog.ChangeSet            : ChangeSet classpath:db/changelogs/0004.transfrom_translatable_data.yaml::004.transform_translatable_data::vetemi ran successfully in 0ms

注意日志消息末尾,执行时间为0ms。这是可疑的。

在H2上运行相同的设置会显示16ms的执行时间:

2018-12-07 16:37:40.699  INFO 13648 --- [           main] liquibase.changelog.ChangeSet            : ChangeSet classpath:db/changelogs/0004.transfrom_translatable_data.yaml::004.transform_translatable_data::vetemi ran successfully in 16ms

显然脚本没有运行,即使Spring和Liquibase没有显示任何错误。

迁移脚本:

INSERT INTO `activity_translatables` (`id`, `name`, `description`, `modified`, `created`, `language_id`, `parent_id`)
        SELECT UUID(), activities.name, activities.description, activities.modified, activities.created, languages.id, activities.id
        FROM `activities`, `languages`
        WHERE languages.locale = 'de';

液基变更日志:

- changeSet:
    id: 004.transform_translatable_data
    author: vetemi
    changes:
    - sqlFile:
        dbms: h2, mysql
        encoding: utf8
        endDelimiter: \nGO
        path: ../data/004.transform_translatable.sql
        relativeToChangelogFile: true
        splitStatements: true
        stripComments: true

我也试过:

- changeSet:
id: 004.transform_translatable_data
        author: vetemi
        changes:
        - sql:
        comment: transfer all activities translatables into the new table with German as default
        dbms: mysql, h2
        splitStatements: true
        sql: insert into activities_translatables (id, name, modified, created, language_id, parent_id)
                    select UUID(), activities.description, activities.modified, activities.created, languages.id, activities.id
                    from activities, languages
                    where languages.locale = 'de'
        stripComments: true

属性文件:

spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=root
spring.datasource.password=
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.platform=mysql

我错过了什么?为什么不起作用?

共有1个答案

吕英豪
2023-03-14

我们目前正在从Spring Boot 1.5. x迁移到Spring Boot 2.1.17,并且我们在LiquibaseMariaDB数据库方面遇到了同样的问题。

问题似乎是他们新区分了MySQLMariaDb,并且此配置不再有效:

<property name="re.component.name" value="edos-dp-project-manager" />

 <changeSet author="edosdp" id="1.0.0-${re.component.name}" logicalFilePath="path-independent">
     <sqlFile encoding="utf8" endDelimiter=";" path="Create_DataBase.sql" relativeToChangelogFile="true" splitStatements="true" stripComments="true" dbms="mysql"/>
     <sqlFile encoding="utf8" endDelimiter=";" path="Create_Database_H2.sql" relativeToChangelogFile="true" splitStatements="true" stripComments="true" dbms="h2"/>
</changeSet>

当这种情况发生时,有一条日志消息(在调试级别!!)说:

2019-10-25 10:33:23,249+0200 [DEBUG] liquibase.changelog.ChangeSet edos-dp-project-manager 1.5.0-SNAPSHOT - Change sqlFile not included for database mariadb

所以,你现在需要将DMBS设置为mariadb,所以更新日志看起来像这样:

<property name="re.component.name" value="edos-dp-project-manager" />
<changeSet author="edosdp" id="1.0.0-${re.component.name}" logicalFilePath="path-independent">
 <sqlFile encoding="utf8" endDelimiter=";" path="Create_DataBase.sql" relativeToChangelogFile="true" splitStatements="true" stripComments="true" dbms="mariadb"/>
 <sqlFile encoding="utf8" endDelimiter=";" path="Create_Database_H2.sql" relativeToChangelogFile="true" splitStatements="true" stripComments="true" dbms="h2"/>
</changeSet>
 类似资料:
  • 我需要在我的服务器上运行函数 但是由于安全原因被禁用,但是PHP执行函数正在运行和。 是否可以使用php函数执行相同的操作? 禁用功能 链接,符号链接,执行,通过,proc_close,proc_get_status,proc_open,shell_exec,系统,流行,关闭

  • 问题内容: 我有一个包含单元测试的Go文件,其中一些使用了公共变量。我正在测试的代码中使用了另一个全局变量。所有这些都可能导致问题。 在Go中,当我们执行位于同一文件中的测试时,它们如何运行?并行还是下一个不会在前一个完成之前开始? 问题答案: 测试起来真的很容易: 使用运行它,输出显示它是顺序的: 因此,正常的测试是依次执行的,但是请不要忘记未定义顺序:如何依次运行golang测试? 还要注意,

  • 如题,mysql中,如果有多个请求,其内部是按顺序执行sql语句吗?比如先执行sql1,得到返回值后再执行sql2,得到sql2的返回值,然后执行sql3,以此类推。还是说是多线程处理的,多个sql语句一起执行的?

  • 我有一个Gradle任务,简单地将文件从一个文件夹复制到另一个文件夹。 当在配置阶段调用copy'from''into'方法时,它可以工作,但当在执行阶段调用它们时,它就不工作了。 这样做是有效的 gradle copyServerConfig 如果我把它放在doFirst{}块中,也会发生同样的事情。 我不明白的另一件事是: gradle task1 但如果我改成这样: gradle task1

  • 运算操作是在Java代码中执行还是在Mysql的where子句中执行 假如age建立了索引,现在要对所有要查询的age进行一个加一操作,那么这个操作是放在Java代码中好还是SQL语句中好 放在SQL语句时的Mybatis代码 本来是觉得直接放在SQL语句中就行,但想着如果在where子句中进行表达式操作会造成索引失效,就在考虑

  • 问题内容: 在MySQL中,我试图找到一种有效的方法来执行更新(如果表中已经存在一行),或者执行INSERT(如果该行不存在)。 到目前为止,我发现了两种可能的方法: 一个明显的例子:打开一个事务,选择以查找该行是否存在,如果不存在则进行INSERT,如果存在则进行UPDATE,提交事务 首先将IGNORE插入表中(如果该行已存在,则不会引发错误),然后进行更新 第二种方法避免了交易。 您认为哪一