2016-08-18 20 views
5

Tôi đang cố gắng để thêm phần mở rộng PostGIS để cơ sở dữ liệu của mình thông qua Postgressql Liquibase, dưới đây là cách tôi đã thực hiện nó:Liquibase dropFirst với PostGIS

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

Nó hoạt động tốt, vấn đề là khi tôi đang phát triển Tôi muốn cơ sở dữ liệu của tôi được thiết lập lại mỗi khi tôi khởi động lại máy chủ web của tôi, vì vậy tôi đã thiết liquibase vào mùa xuân như thế này

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

Và như vậy Liquibase cố gắng thả tất cả mọi thứ, kể cả xem PostGIS, lúc khởi động. Điều gì dẫn đến lỗi này

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

Nhưng làm thế nào tôi phải báo cho liquibase bỏ tiện ích mở rộng trước khi xóa mọi thứ khác? Có cách nào để nói với Liquibase làm thế nào để thả một cơ sở dữ liệu?

phiên bản tôi đang sử dụng:

  • Xuân IO 2.0.7
  • Liquibase 3.4.2 (phiên bản được thiết lập bởi mùa xuân IO)
  • Postgres 9,5
+0

Tôi tin rằng liquibase không biết về các phần mở rộng ở hậu trường và do đó không thả chúng. Liquibase sẽ cố gắng tìm tất cả các đối tượng trong lược đồ bạn đang sử dụng, sau đó xây dựng một danh sách các lệnh thả và thực hiện nó. Có lẽ nó sẽ giúp khi bạn thêm một khai báo lược đồ vào câu lệnh mở rộng của bạn như 'CREATE EXTENSION IF NOT EXISTS postgis SCHEMA public;' - nhưng đó chỉ là phỏng đoán trong tự nhiên và có thể không tạo sự khác biệt ... – Jens

+0

Là 'public' là lược đồ mặc định, nó đã được thêm vào lược đồ này. Ừ, liquibase dường như không biết về phần mở rộng postgres, vì vậy có vẻ như chúng ta phải sử dụng một số giải pháp thay thế khác để quản lý – lepak

Trả lời

3

Giải Quyết này bằng cách thêm một chút SQL được thực hiện trước khi bắt đầu Liquibase:

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

với tập tin src/main/nguồn/xóa-postgis.sql là

DROP EXTENSION IF EXISTS postgis; 

Đó không phải là ưa thích, nhưng nó hoạt động.

Các vấn đề liên quan