2016-08-18 91 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; 

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