为啥我的 liquibase modifySQL 子句没有被触发?

Posted

技术标签:

【中文标题】为啥我的 liquibase modifySQL 子句没有被触发?【英文标题】:Why my liquibase modifySQL clause is not triggered?为什么我的 liquibase modifySQL 子句没有被触发? 【发布时间】:2016-09-22 15:40:15 【问题描述】:

我正在尝试使用liquibase(在spring-boot 项目中)定义我的DBMS 架构。这个项目的相关部分是我正在尝试设置的 JSON 存储。

即使我知道大多数关系型 DBMS 无法正确处理 JSON 或刚刚开始(至于 2016 年 5 月),我也想要一种与供应商无关的模式。 因此,我将 blob(或其他任何东西,建议将不胜感激)设置为任何 RDBMS 的默认数据类型,并且我将其专门用于那些能够处理的人:著名的 JSONB 用于postgresql,或者至少 JSON 用于h2 和mysql.

当我使用spring-boot 时,我没有那么多配置(确实没有;))

似乎没有触发 modifySQL 子句。我正在使用以下变更集。

YAML Liquibase 变更集

databaseChangeLog:
  - changeSet:
      id: 1
      author: jrevy
      changes:
        - createTable:
            tableName: recipe
            columns:
              - column:
                  name: id
                  type: uuid
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: name
                  type: varchar(255)
                  constraints:
                    nullable: false
              - column:
                  name: data
                  type: blob
                  constraints:
                    nullable: false
      modifySql:
        - replace:
            dbms: postgresql
            replace: blob
            with: jsonb
        - replace:
            dbms: h2,mysql
            replace: blob
            with: json  

结果

INFO 24/05/16 14:56: liquibase: Successfully acquired change log lock
INFO 24/05/16 14:56: liquibase: Creating database history table with name: public.databasechangelog
INFO 24/05/16 14:56: liquibase: Reading from public.databasechangelog
INFO 24/05/16 14:56: liquibase: classpath:/db/changelog/db.changelog-master.yaml: classpath:/db/changelog/db.changelog-master.yaml::1::jrevy: Table recipe created
INFO 24/05/16 14:56: liquibase: classpath:/db/changelog/db.changelog-master.yaml: classpath:/db/changelog/db.changelog-master.yaml::1::jrevy: ChangeSet classpath:/db/changelog/db.changelog-master.yaml::1::jrevy ran successfully in 46ms
INFO 24/05/16 14:56: liquibase: Successfully released change log lock
[...]
INFO 67628 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core 4.3.11.Final
2016-05-24 14:56:33.765  INFO 67628 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2016-05-24 14:56:33.765  INFO 67628 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2016-05-24 14:56:34.030  INFO 67628 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations 4.0.5.Final
2016-05-24 14:56:34.280  INFO 67628 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL9Dialect

-->

-- Column: data

-- ALTER TABLE recipe DROP COLUMN data;

ALTER TABLE recipe  ADD COLUMN data bytea;
ALTER TABLE recipe ALTER COLUMN data SET NOT NULL;

数据类型应该是jsonb,而不是 bytea(如果我使用 jsbon 作为默认数据类型,它工作得很好,但仅适用于 pgSQL)。

问题

如何知道是否检测到/触发了 modifySQL 子句? 您知道为什么它没有按预期工作吗?

【问题讨论】:

【参考方案1】:

删除 - 替换 (https://github.com/liquibase/liquibase/blob/e0badd697d82a87ba868b41e68b659cf8c8e68e8/liquibase-integration-tests/src/test/resources/changelogs/yaml/rollback.tests.changelog.yaml) 之前?

尝试不带dbms的modifySql,看是否触发。并使用 liquibase cmd 行进行测试以排除 spring-boot 错误。

【讨论】:

以上是关于为啥我的 liquibase modifySQL 子句没有被触发?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 liquibase 无法解析 db.changelog 类路径?

无法通过我的 spring maven 项目集成和运行 liquibase

liquibase:你能用 liquibase addColumn 指定“列后”吗?

Liquibase Java,变更集不适用

Liquibase Maven 无法读取 changeLogFile

如果 Liquibase 因更改集迁移失败而失败,我的 csv 数据有啥问题...原因:java.lang.NullPointerException