2016-08-18 6 views
5

Ich versuche postgis Erweiterung meiner PostgresSQL Datenbank durch Liquibase, hier ist, wie ich habe es getan hinzuzufügen:Liquibase dropFirst mit postgis

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

Es funktioniert gut, Problem ist, wenn ich entwickle ich will meine Datenbank zu sein, jedes Mal setze ich meine Web-Server neu starten, also habe ich ähnliche

@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 im Frühjahr gesetzt und so versucht Liquibase alles fallen zu lassen, einschließlich postgis Ansichten, beim Start. Was führt zu diesem Fehler?

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

Aber wie soll ich Liquibase sagen, um Erweiterungen zu löschen, bevor Sie alles andere fallen lassen? Gibt es eine Möglichkeit, Liquibase mitzuteilen, wie eine Datenbank gelöscht wird?

Versionen Ich verwende:

  • Frühling IO 2.0.7
  • Liquibase 3.4.2 (Version von Spring IO eingestellt)
  • Postgres 9,5
+0

Ich glaube, dass liquibase über Erweiterungen in Postgres nicht weiß und sie daher nicht fallen lässt. Liquibase wird versuchen, alle Objekte in dem Schema zu finden, das Sie verwenden, dann eine Liste von Drop-Anweisungen erstellen und sie ausführen. Vielleicht hilft es, wenn Sie Ihrer create extension-Anweisung eine Schema-Deklaration hinzufügen, wie 'CREATE EXTENSION WENN NICHT EXISTS postgis SCHEMA public;' - aber das ist nur eine Vermutung in der Wildnis und macht vielleicht keinen Unterschied ... – Jens

+0

Als 'public' ist das Standardschema, das bereits zu diesem hinzugefügt wurde. Ja, Liquibase scheint sich der Postgres-Erweiterung nicht bewusst zu sein, also müssen wir wohl auf eine andere Alternative zurückgreifen, um das zu managen – lepak

Antwort

3

dies gelöst durch Hinzufügen ein bisschen SQL, das vor dem Start von Liquibase ausgeführt wird:

@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; 
} 

mit Datei src/main/resources/Löschen-postgis.sql

DROP EXTENSION IF EXISTS postgis; 

ist, dass keine Lust, aber es funktioniert.