PnX-SI / gn_module_ZH

Module de GeoNature d'inventaire des zones humides
GNU General Public License v3.0
4 stars 6 forks source link

Création des VMs invertebres, vertebres et flore interrompu (sous-requête renvoie plus d'une ligne) #79

Open JulesGrillot opened 3 weeks ago

JulesGrillot commented 3 weeks ago

L'installation du module version 1.3.1 se bloque lors de la création des VMs : [https://github.com/PnX-SI/gn_module_ZH/blob/3ffb8d1d5119c8345e0e2fce1b487666627f1b27/backend/gn_module_zh/migrations/c0c4748a597a_create_vm_taxons.py#L21](Code SQL présent ici)

L'erreur rencontrée : sqlalchemy.exc.ProgrammingError: (psycopg2.errors.CardinalityViolation) ERREUR: plus d'une ligne renvoyée par une sous-requête utilisée comme une expression

Il semblerait que ce soit la sous-requête suivante qui pose problème :

synthese_taxa AS (
    SELECT 
        synthese.id_synthese,
        ( 
            SELECT t_zh.id_zh
            FROM pr_zh.t_zh
            WHERE st_intersects(st_setsrid(t_zh.geom, 4326), st_setsrid(synthese.the_geom_point, 4326))
        ) AS id_zh,
        synthese.cd_nom,
        synthese.date_max,
        synthese.observers,
        (   
            SELECT organisme 
            FROM utilisateurs.v_userslist_forall_applications 
            WHERE nom_role || ' ' || prenom_role = synthese.observers limit 1
        )
    FROM gn_synthese.synthese
)

La création de id_zh renvoie effectivement plusieurs fois la même entité, il faudrait peut-être créer une sous requête supplémentaire qui contient id_synthese et id_zh et la joindre a synthese_taxa. Comme ceci (fonctionne lors de la réinstallation du module à condition de recréer les VMs pr_zh.vm_vertebrates, pr_zh.vm_invertebrates et pr_zh.vm_flora):

WITH 
                t_id_zh AS (
                        SELECT synthese.id_synthese, t_zh.id_zh
                        FROM pr_zh.t_zh, gn_synthese.synthese
                        WHERE st_intersects(st_setsrid(t_zh.geom, 4326), st_setsrid(synthese.the_geom_point, 4326))
                        ORDER BY id_zh
                ),
                synthese_taxa AS (
                    SELECT 
                        synthese.id_synthese,
                        t_id_zh.id_zh,
                        synthese.cd_nom,
                        synthese.date_max,
                        synthese.observers,
                        (   
                            SELECT organisme 
                            FROM utilisateurs.v_userslist_forall_applications 
                            WHERE nom_role || ' ' || prenom_role = synthese.observers limit 1
                        )
                    FROM gn_synthese.synthese
                    JOIN t_id_zh ON t_id_zh.id_synthese = synthese.id_synthese
                )