sql 文件中的 Liquibase 参数与 spring-boot
Liquibase parameter in sql file with spring-boot
在我的变更日志 xml 文件中,我有以下内容
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet id="seed_testtest_18" author="me" failOnError="true">
<sqlFile path="dml/seed-data.sql" relativeToChangelogFile="true" />
</changeSet>
</databaseChangeLog>
在 dml/seed-data.sql 文件中,我需要使用一个基于正在使用的 spring 引导配置文件的变量
INSERT INTO ${keyspace}.TESTTEST (ID, NAME, AGE, EMAIL, PHONE) VALUES (14, 'Dennis Vo', 20, 'dennis.n.vo@chase.com', '272-324-8912');
在我的 application.yml 文件中,我的键空间定义如下
spring:
config:
activate:
on-profile: local
liquibase:
parameters:
keyspace: localkeyspace
但是,当我 运行 应用程序时,键空间的值没有被使用。在使用 sql 文件时有没有办法做到这一点?
据我了解,您想在不同的环境中使用不同的 schema/keyspace (cassandra!?)!?
让你的sql“schema/keyspace免费”:
INSERT INTO TESTTEST -- ...
那么在application-local.properties
中,我们会:
spring.liquibase.defaultSchema=localkeyspace
...在 application-int.properties
:
spring.liquibase.defaultSchema=int_keyspace
...在 application[-prod].properties
:
spring.liquibase.defaultSchema=prod_keyspace
这将(希望)将您的 (1) 个脚本路由到每个环境的正确模式。
如果 sql 中有比这(内置 liquibase 配置)“更多的动态”,我们必须:维护同一变更集的多个 sql(-> 上下文: https://docs.liquibase.com/workflows/liquibase-community/existing-project.html), 然后可以写成:
<changeSet id="seed_testtest_18_local" context="local" author="me" failOnError="true">
<sqlFile path="dml/seed-data_local.sql" relativeToChangelogFile="true" />
</changeSet>
<changeSet id="seed_testtest_18_uat" context="uat" author="me" failOnError="true">
<sqlFile path="dml/seed-data_uat.sql" relativeToChangelogFile="true" />
</changeSet>
<changeSet id="seed_testtest_18_prod" context="prod" author="me" failOnError="true">
<sqlFile path="dml/seed-data_prod.sql" relativeToChangelogFile="true" />
</changeSet>
在application[-profile].properties|yaml
中:
spring.liquibase.contexts=local # ...or e.g.: !local, uat & prod, ${spring.profiles.active}..., matching changelog contexts!
另一种(构建时)方法:maven 配置文件 + 资源 filtering/antrun/...
在我的变更日志 xml 文件中,我有以下内容
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet id="seed_testtest_18" author="me" failOnError="true">
<sqlFile path="dml/seed-data.sql" relativeToChangelogFile="true" />
</changeSet>
</databaseChangeLog>
在 dml/seed-data.sql 文件中,我需要使用一个基于正在使用的 spring 引导配置文件的变量
INSERT INTO ${keyspace}.TESTTEST (ID, NAME, AGE, EMAIL, PHONE) VALUES (14, 'Dennis Vo', 20, 'dennis.n.vo@chase.com', '272-324-8912');
在我的 application.yml 文件中,我的键空间定义如下
spring:
config:
activate:
on-profile: local
liquibase:
parameters:
keyspace: localkeyspace
但是,当我 运行 应用程序时,键空间的值没有被使用。在使用 sql 文件时有没有办法做到这一点?
据我了解,您想在不同的环境中使用不同的 schema/keyspace (cassandra!?)!?
让你的sql“schema/keyspace免费”:
INSERT INTO TESTTEST -- ...
那么在application-local.properties
中,我们会:
spring.liquibase.defaultSchema=localkeyspace
...在 application-int.properties
:
spring.liquibase.defaultSchema=int_keyspace
...在 application[-prod].properties
:
spring.liquibase.defaultSchema=prod_keyspace
这将(希望)将您的 (1) 个脚本路由到每个环境的正确模式。
如果 sql 中有比这(内置 liquibase 配置)“更多的动态”,我们必须:维护同一变更集的多个 sql(-> 上下文: https://docs.liquibase.com/workflows/liquibase-community/existing-project.html), 然后可以写成:
<changeSet id="seed_testtest_18_local" context="local" author="me" failOnError="true">
<sqlFile path="dml/seed-data_local.sql" relativeToChangelogFile="true" />
</changeSet>
<changeSet id="seed_testtest_18_uat" context="uat" author="me" failOnError="true">
<sqlFile path="dml/seed-data_uat.sql" relativeToChangelogFile="true" />
</changeSet>
<changeSet id="seed_testtest_18_prod" context="prod" author="me" failOnError="true">
<sqlFile path="dml/seed-data_prod.sql" relativeToChangelogFile="true" />
</changeSet>
在application[-profile].properties|yaml
中:
spring.liquibase.contexts=local # ...or e.g.: !local, uat & prod, ${spring.profiles.active}..., matching changelog contexts!
另一种(构建时)方法:maven 配置文件 + 资源 filtering/antrun/...