2016-08-18 86 views
5

我想PostGIS的扩展添加到通过Liquibase我的PostgreSQL的数据库,这里是如何我已经做到了:Liquibase dropFirst在PostGIS

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

它工作正常,问题是,当我开发我想我的数据库被重置每次我重新启动我的Web服务器的时间,所以我给自己定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的意见,在启动时。这导致这个错误

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

但我应该如何告诉liquibase放弃扩展之前放弃一切?有没有办法告诉Liquibase如何删除数据库?

版本我使用的是:

  • 春IO 2.0.7
  • Liquibase
  • 的Postgres 3.4.2(由Spring IO集版本)9.5
+0

我相信liquibase不知道postgres中的扩展名,因此不会删除它们。 Liquibase将尝试查找所用模式中的所有对象,然后构建一个drop语句列表并执行它。当你为你的create扩展语句添加一个模式声明,比如'CREATE EXTENSION IF NOT EXISTS postgis SCHEMA public;' - 但这只是一种猜测,可能没有什么区别...... – Jens

+0

由于'public'是默认架构,它已经添加到这个。是的,liquibase似乎不知道postgres扩展,所以我们似乎不得不求助于其他方法来管理 – lepak

回答

3

加入解决了这个在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 /主/资源/删除-postgis.sql是

DROP EXTENSION IF EXISTS postgis; 

这不是幻想,但它的工作原理。