gpt4 book ai didi

spring - Liquibase dropFirst 与 postgis

转载 作者:行者123 更新时间:2023-12-02 06:45:07 31 4
gpt4 key购买 nike

我正在尝试通过 Liquibase 将 postgis 扩展添加到我的 postgressql 数据库,这是我的做法:

<sql>CREATE EXTENSION IF NOT EXISTS postgis;</sql>

它工作正常,问题是当我开发时,我希望每次重新启动我的网络服务器时重置我的数据库,所以我在 spring 中设置了 liquibase 像这样

@Bean(name = "liquibase")
@DependsOn("dataSource")
@Profile("dev")
public SpringLiquibase liquibaseDev() {
SpringLiquibase springLiquibase = new SpringLiquibase();
springLiquibase.setDataSource(this.dataSource());
springLiquibase.setChangeLog("classpath:liquibase.xml");
springLiquibase.setDefaultSchema(this.environment.getProperty("jdbc.defaultSchema"));
springLiquibase.setDropFirst(true);
return springLiquibase;
}

因此 Liquibase 尝试在启动时删除所有内容,包括 postgis View 。这导致了这个错误

org.postgresql.util.PSQLException: ERROR: cannot drop view geography_columns because extension postgis requires it Indice : You can drop extension postgis instead.

但是我应该如何告诉 liquibase 在删除其他所有内容之前删除扩展程序?有没有办法告诉 Liquibase 如何删除数据库?

我正在使用的版本:

  • Spring IO 2.0.7
  • Liquibase 3.4.2(Spring IO 设置的版本)
  • Postgres 9.5

最佳答案

通过添加一点在 Liquibase 启动之前执行的 SQL 解决了这个问题:

@Bean(name = "liquibase")
@DependsOn("dataSource")
@Profile("dev")
public SpringLiquibase liquibaseDev() {

ScriptUtils.executeSqlScript(this.dataSource().getConnection(), new ClassPathResource("delete-postgis.sql"));

SpringLiquibase springLiquibase = new SpringLiquibase();
springLiquibase.setDataSource(this.dataSource());
springLiquibase.setChangeLog("classpath:liquibase.xml");
springLiquibase.setDefaultSchema(this.environment.getProperty("jdbc.defaultSchema"));
springLiquibase.setDropFirst(true);
return springLiquibase;
}

文件 src/main/resources/delete-postgis.sql 为

DROP EXTENSION IF EXISTS postgis;

这并不花哨,但确实有效。

关于spring - Liquibase dropFirst 与 postgis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39015653/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com