PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » Lire le contenu d'un projet QGIS dans PgAdmin4 » 21/10/2022 08:07:05

Bonjour,
Je vais donc explorer cette nouvelle piste.
Merci encore pour votre aide.
Bonne journée.

#2 Re : Général » Lire le contenu d'un projet QGIS dans PgAdmin4 » 19/10/2022 15:50:35

Pas de problème, je vais donc explorer cette voie.
Merci beaucoup pour votre aide.
Bonne fin de journée

#3 Re : Général » Lire le contenu d'un projet QGIS dans PgAdmin4 » 19/10/2022 14:59:07

Ces informations sont donc stockées dans Postgresql mais non requêtables via PgAdmin ? sad
Il est donc impossible via PgAmin de connaître la liste des tables postgis appelées dans un projet qgis ?

Merci d'avance pour votre réponse

#4 Général » Lire le contenu d'un projet QGIS dans PgAdmin4 » 19/10/2022 12:13:27

SebCham
Réponses : 6

Bonjour à tous et toutes,

J'ai découvert récemment qu'il était possible, sans QGIS, d'enregistrer un projet .qgs non pas sur un espace serveur classique mais directement sur Postgresql (Dans Qgis 3.16 = Projet\Enregistrer sous\Postgresql...).
Je souhaitais donc interroger les informations relatives au paramétrage de mes couches qgis dans PgAdmin4 (essentiellement pour connaître les couches postgis appelées dans ce projet qgs) mais ces informations sont stockées dans un champ "content"au format bytea, illisible au 1er abord.
En parcourant les forums et sites officiels tels que ceux-ci :
https://www.postgresql.org/docs/9.1/fun … tring.html
https://dba.stackexchange.com/questions … n-postgres

J'ai découvert qu'il fallait utiliser des fonctions d'encodage et/ou de décodage en m'appuyant sur des formats de type base64, hex ou escape pour traduire ces données bytea en informations intelligibles.
Cependant après plusieurs tests de ce type dans pgAdmin, je n'obtiens aucun résultat probant :

select *,
encode(content,'hex') tt
from admingeo.qgis_projects


SELECT convert_from(decode(t, 'escape'), 'UTF8')
FROM encode((select content from admingeo.qgis_projects), 'escape') as tt


L'un ou l'une d'entre vous aurait-il (-elle) une idée me permettant de traduire le contenu de ce champ en informations intelligibles ?

Merci d'avance pour votre aide wink

#5 Re : PL/pgSQL » Fonction déclencheur et utilisation de TG_TABLE_XXXX » 07/10/2022 15:57:05

Super, ca fonctionne parfaitement ! Merci beaucoup (je vous dois une fière chandelle). wink
Je vais enfin pouvoir créer des fonctions plus intelligentes et optimisées !
Bon week-end à vous

#6 Re : PL/pgSQL » Fonction déclencheur et utilisation de TG_TABLE_XXXX » 07/10/2022 14:33:42

Merci beaucoup pour votre aide smile
Je ne maîtrise pas du tout les requêtes dynamiques, désolé.

J'ai modifié ma requête ainsi :

(...)
EXECUTE format('SELECT count(*) FROM %I.%I as x
                    WHERE ST_Intersects(x.geom, NEW.geom)
                             AND x.id != NEW.id AND ST_overlaps(x.geom, NEW.geom)',                   
                    TG_TABLE_SCHEMA, TG_TABLE_NAME) INTO c;   
(...)


et j'obtiens ce message d'erreur dans QGIS :
" ERREUR:  entrée manquante de la clause FROM pour la table « new » "

Je suppose qu'il ne reconnait plus cette syntaxe à l'intérieur de la requête dynamique mais je ne sais pas comment désigner autrement la géométrie et l'id du dernier objet saisi...
Auriez-vous une idée ?

Merci d'avance pour votre aide.

#7 PL/pgSQL » Fonction déclencheur et utilisation de TG_TABLE_XXXX » 07/10/2022 11:33:42

SebCham
Réponses : 5

Bonjour à tous et tous,

J'essaie sous Postgresql de créer une contrainte de vérification de la topologie d'objets insérés sur une table test.topo1 (pour empêcher la saisie sous QGIS d'objets se chevauchant).
Pour faire cela, j'ajoute un trigger sur cette table et je créé une fonction déclencheur. Ce qui donne ceci :

CREATE OR REPLACE FUNCTION admingeo.overlapping_parcel_trigger()
  RETURNS trigger AS
  $$
    DECLARE
      c bigint;
    BEGIN

      SELECT count(*)
      INTO c
      FROM test.topo1 t1
      WHERE ST_Intersects(t1.geom, NEW.geom)
      AND t1.id != NEW.id
      AND ST_Relate(t1.geom, NEW.geom, '2********');

      IF c > 0 THEN
        RAISE EXCEPTION 'l''objet % empiète sur un autre objet', NEW.id;
      END IF;

    RETURN NEW;
    END;
  $$
  LANGUAGE 'plpgsql';


CREATE CONSTRAINT TRIGGER verif_topo
    AFTER INSERT OR UPDATE ON test.topo1
    FOR EACH ROW EXECUTE FUNCTION admingeo.overlapping_parcel_trigger();


Cette procédure fonctionne parfaitement mais je dois rentrer en dur le nom de la table sur lequel est posé mon trigger, ce qui n'est pas du tout optimal.
J'ai donc essayé d'introduire TG_TABLE_SCHEMA et TG_TABLE_NAME mais sans aucun succès après des dizaines de tentatives.
L'un de vous aurait-il une solution à mon problème svp ?
Merci d'avance pour votre aide.


Voici le code de ma dernière tentative :

CREATE or replace FUNCTION admingeo.overlapping_parcel_trigger()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
    DECLARE
      c bigint;   
      t1 text;
      
    BEGIN
                    
    EXECUTE format('select (schemaname::text||''.''||tablename::text)::regclass t from pg_tables where schemaname=%I and tablename=%I',TG_TABLE_SCHEMA,TG_TABLE_NAME) INTO t1;      
    
          
      SELECT Count(*)
      INTO c
      
      FROM t1
            
      WHERE ST_Intersects(t1.geom, NEW.geom)
      AND t1.id != NEW.id
      AND ST_overlaps(t1.geom, NEW.geom);

      IF c > 0 THEN
        RAISE EXCEPTION 'l''objet % empiète sur un autre objet', NEW.id;
      END IF;

      RETURN NEW;
    END;
  $BODY$;


Merci.

Pied de page des forums

Propulsé par FluxBB