为什么我的 liquibase modifySQL 子句没有被触发?
Why my liquibase modifySQL clause is not triggered?
我正在尝试使用 liquibase (in a spring-boot 项目定义我的 DBMS 模式)。该项目的相关部分是我正在尝试设置的 JSON 存储。
即使我知道大多数关系型 DBMS 都无法正确处理 JSON 或者才刚刚开始(截至 2016 年 5 月),但我想要一种与供应商无关的架构。
因此,我将 blob(或其他任何东西,建议将不胜感激)设置为任何 RDBMS 的默认数据类型,并且我将其专门用于那些能够处理的数据类型:著名的 JSONB for postgresql, or a least JSON for h2 and mysql.
当我使用 spring-boot 时,我没有那么多配置(确实 none ;))
好像没有触发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 子句?
- 你知道为什么它没有按预期工作吗?
之前
试试不带dbms的modifySql看是否触发。并使用 liquibase cmd 行进行测试以排除 spring-boot 错误。
我正在尝试使用 liquibase (in a spring-boot 项目定义我的 DBMS 模式)。该项目的相关部分是我正在尝试设置的 JSON 存储。
即使我知道大多数关系型 DBMS 都无法正确处理 JSON 或者才刚刚开始(截至 2016 年 5 月),但我想要一种与供应商无关的架构。 因此,我将 blob(或其他任何东西,建议将不胜感激)设置为任何 RDBMS 的默认数据类型,并且我将其专门用于那些能够处理的数据类型:著名的 JSONB for postgresql, or a least JSON for h2 and mysql.
当我使用 spring-boot 时,我没有那么多配置(确实 none ;))
好像没有触发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 子句?
- 你知道为什么它没有按预期工作吗?
试试不带dbms的modifySql看是否触发。并使用 liquibase cmd 行进行测试以排除 spring-boot 错误。