让 Liquibase 执行一个 shp2pgsql PostGIS 命令

Make Liquibase execute a shp2pgsql PostGIS command

我有一个针对 PostGis 数据库的 Liquibase 变更集:

<!--Création de la table et vue sur les données du chômage dans les communes en 2016 -->
<changeSet id="chomage_2016" author="mlebihan">
    <comment>Table du chômage par communes en 2016.</comment>
        
    <sql>
         CREATE TABLE chomage_2016(
            codecommune VARCHAR(5) PRIMARY KEY, 
            nomcommune VARCHAR NOT NULL,
            sirencommune VARCHAR NOT NULL,
            populationtotale NUMERIC(10) NOT NULL,
            nombre NUMERIC(10) NOT NULL,
            effectifs NUMERIC(10) NOT NULL,
            pctsurpopactive NUMERIC(4,1) NOT NULL,
            pctsurpoptotale NUMERIC(4,1) NOT NULL
         ) 
         TABLESPACE data;
             
         COMMENT ON TABLE chomage_2016 IS 'Taux de chômage dans les communes en 2016'; 
         COMMENT ON COLUMN chomage_2016.codecommune IS 'Code de la commune';
         COMMENT ON COLUMN chomage_2016.nomcommune IS 'Nom de la commune';
         COMMENT ON COLUMN chomage_2016.sirencommune IS 'SIREN de la commune';
         COMMENT ON COLUMN chomage_2016.populationtotale IS 'Population totale de la commune (en 2019)';
         COMMENT ON COLUMN chomage_2016.nombre IS 'Nombre de chômeurs';
         COMMENT ON COLUMN chomage_2016.effectifs IS 'Population de plus de 15 ans en 2016';
         COMMENT ON COLUMN chomage_2016.pctsurpopactive IS 'Pourcentage sur la population de plus de 15 ans';
         COMMENT ON COLUMN chomage_2016.pctsurpoptotale IS 'Pourcentage sur la population totale de la commune';

        CREATE INDEX idx_chomage_2016_codeCommune ON chomage_2016(codecommune) TABLESPACE data;
        COMMENT ON INDEX idx_chomage_2016_codeCommune IS 'Taux de chômage dans les communes en 2016, par code commune.';
            
        CREATE VIEW view_chomage_2016 AS 
           SELECT row_number() OVER () AS gid, d.codeCommune, d.nomCommune, d.sirencommune, d.populationtotale, 
               d.nombre, d.effectifs, d.pctsurpopactive, d.pctsurpoptotale, c.geom FROM chomage_2016 d 
           JOIN communes_2019 c ON d.codeCommune = c.insee;
        
        COMMENT ON VIEW view_chomage_2016 IS 'Vue entre les taux de chômage de 2016 et communes (OSM) de 2019.';
    </sql>
        
    <rollback>
        <sql>
            DROP VIEW view_chomage_2016;
            DROP INDEX idx_chomage_2016_codeCommune;
            DROP TABLE chomage_2016;
        </sql>
    </rollback>   
</changeSet>

它创建的视图取决于 commune_2019 table,它是由 PostGISOpenStreetMap shapefile 创建的commune_2019 table =25=] 当前从 bash shell 执行的命令:

shp2pgsql -s 4326 -I /data/comptes-france/territoire/2019/communes.shp public.communes_2019 | psql -d comptesfrance -U postgres -h localhost

我想将此命令的执行集成到我的 Liquibase 脚本中。
可能吗?

  1. shp2pgsql 命令的执行将其 SQL 生成的语句发送给需要密码才能连接的 psql到数据库,并且该密码无法通过其命令行发送。我用 export PGPASSWORD=....

    设置了它
  2. export 命令不是真正的可执行文件,而是 bash.
    的内置命令 因此,必须通过 bash 命令调用它。 bash 命令带有一个 -c 选项,它会启动一个新会话,shp2pgsql 必须紧随其后。

<!-- shp2pgsql -s 4326 -I /data/comptes-france/territoire/2016/communes.shp public.communes_2016 | psql -d comptesfrance -U postgres -h localhost -->  
<changeSet id="shp2pgsql_communes_2019" author="mlebihan" failOnError="false">
    <comment>Importation des shapefiles des contours des communes 2019</comment>

    <executeCommand executable="/bin/bash">
        <arg value="-c"/>
        <arg value="export PGPASSWORD=postgres;
             shp2pgsql 
                -s 4326 
                -I /data/comptes-france/territoire/2019/communes.shp 
                public.communes_2019 
           | psql -d comptesfrance -U postgres -h localhost"/>
    </executeCommand>
</changeSet>

注意:第二个参数我写了换行是为了更好的可读性,但当然不是这样,你必须这样写:

<arg value="export PGPASSWORD=postgres;shp2pgsql -s 4326 -I /data/comptes-france/territoire/2019/communes.shp public.communes_2019 | psql -d comptesfrance -U postgres -h localhost"/>