Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Tue 27 February 2018 11:30

Zakh
Participant occasionnel
Date d'inscription: 23 Jul 2015
Messages: 38

POSTGIS - fonction insert

Bonjour,

J'essaie d'apprendre comment comment mettre au point des fonctions d'insert/update pour des vues dans Postgis. La vue en question contient les informations pour des fichiers media joints à une entité dans qgis. La vue est basées sur deux tables : od_file et od_data_media, l'une comprenant les informations du fichier à joindre, l'autre les informations du répertoire où sont stockés les médias. L'URL du fichier est ainsi une concaténation de deux éléments et est défini comme ceci :

Code:

Select 
dm.path::text || f.path_relative::text AS _url

avec dm = od_data_media, et f = od_file

Dans ma fonction d'insert, j'ai par conséquent besoin de faire le chemin inverse, donc de décomposer l'url.

Comme od_file contient pour chaque entité une foreign key pointant sur od_data_media, je cherche en premier lieu à aller chercher cette fk. (les autres attributs viendront ensuite)

J'ai essayé de faire ça de la manière suivante :

Code:

REATE OR REPLACE FUNCTION qgep.vw_file_insert()
  RETURNS trigger AS
$BODY$
DECLARE
    _fk character varying(16);
    _path_relative character varying(100);
    _path character varying(100);

BEGIN

-- foreign key
  SELECT 
    dm.obj_id INTO _fk
  FROM 
    qgep.od_data_media dm
  WHERE 
    dm.path like COALESCE (substring(NEW._url, 1, 20),'%');



  INSERT INTO  qgep.od_file(

      obj_id,
      class,
      identifier,
      kind,
      object,
      --path_relative,
      remark,
      --last_modification,
      --fk_dataowner,
      --fk_provider,
      fk_data_media
      )
  VALUES
      (qgep.generate_oid('od_file'::text),
      NEW.class,
      NEW.identifier, 
      NEW.file_kind,
      NEW.object,
      --_path_relative,
      NEW.remark,
      _fk
      );
  
  RETURN NEW;
END; $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION qgep.vw_file_insert()
  OWNER TO postgres;

Malheureusement, si cette fonction a bien tourné sur ma base, sans erreur, lorsque je fais un teste d'ajout d'une entité dans qgis... la foreign key reste vide, et je n'arrive pas à comprendre pourquoi.

En faisant un teste

Code:

SELECT 
    dm.obj_id --INTO _fk_data_media
  FROM 
    qgep.od_data_media dm, qgep.vw_file
  WHERE 
    dm.path like COALESCE (substring(vw_file._url, 1, 20),'%');

J'ai bien les obj_id de la table data_media qui sont retournés.

Help ^^

Hors ligne

 

#2 Tue 27 February 2018 11:50

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

Re: POSTGIS - fonction insert

Salut,

pouvez vous rajouter la déclaration du trigger ?

Hors ligne

 

#3 Tue 27 February 2018 11:52

Zakh
Participant occasionnel
Date d'inscription: 23 Jul 2015
Messages: 38

Re: POSTGIS - fonction insert

Hello,

il s'agit des annonces dans la création de la vue comme ci-dessous?

Code:

-- View: qgep.vw_file

-- DROP VIEW qgep.vw_file;

CREATE OR REPLACE VIEW qgep.vw_file AS 
 SELECT f.obj_id,
    f.identifier,
    f.kind AS file_kind,
    f.object,
    f.class,
    dm.path,
    dm.path::text || f.path_relative::text AS _url,
    f.remark
   FROM qgep.od_file f
     LEFT JOIN qgep.od_data_media dm ON dm.obj_id::text = f.fk_data_media::text;

ALTER TABLE qgep.vw_file
  OWNER TO postgres;

-- Trigger: vw_file_delete on qgep.vw_file

-- DROP TRIGGER vw_file_delete ON qgep.vw_file;

CREATE TRIGGER vw_file_delete
  INSTEAD OF DELETE
  ON qgep.vw_file
  FOR EACH ROW
  EXECUTE PROCEDURE qgep.vw_file_delete();

-- Trigger: vw_file_insert on qgep.vw_file

-- DROP TRIGGER vw_file_insert ON qgep.vw_file;

CREATE TRIGGER vw_file_insert
  INSTEAD OF INSERT
  ON qgep.vw_file
  FOR EACH ROW
  EXECUTE PROCEDURE qgep.vw_file_insert();

-- Trigger: vw_file_update on qgep.vw_file

-- DROP TRIGGER vw_file_update ON qgep.vw_file;

CREATE TRIGGER vw_file_update
  INSTEAD OF UPDATE
  ON qgep.vw_file
  FOR EACH ROW
  EXECUTE PROCEDURE qgep.vw_file_update();

Hors ligne

 

#4 Tue 27 February 2018 12:44

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

Re: POSTGIS - fonction insert

Oui c'est çà.

Vous avez testé la fonction ou un insert dans la base ?

Dernière modification par tumasgiu (Tue 27 February 2018 12:45)

Hors ligne

 

#5 Tue 27 February 2018 13:04

Zakh
Participant occasionnel
Date d'inscription: 23 Jul 2015
Messages: 38

Re: POSTGIS - fonction insert

La fonction est compilée (et incomplète, je cherche en premier lieu à avoir _fk qui s'enregistre dans la table od_file, les autres attributs viendront ensuite)

C'est lors d'un insert depuis qgis que ceci ne s'insert pas correctement avec la fonction. Mais aucun message d'erreur. Je fais une nouvelle entrée dans la vue vw_file, je précise un jpg, qui doit donc avoir son chemin d'accès dans _url, sur lequel la partie

Code:

-- foreign key
  SELECT 
    dm.obj_id INTO _fk
  FROM 
    qgep.od_data_media dm
  WHERE 
    dm.path like COALESCE (substring(NEW._url, 1, 20),'%');

devrait permettre de récupérer _fk qui devrait être poussée avec le INSERT INTO ... VALUE

Hors ligne

 

#6 Tue 27 February 2018 14:19

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

Re: POSTGIS - fonction insert

Quelle version de QGIS utilisez vous ?

J'ai testé sous QGIS 3 et cela à l'air de fonctionner
en mode table d'attribut ou couche géométrique.

Voila le script SQL que j'ai utilisé :

Code:

CREATE SCHEMA qgep;
CREATE  TABLE qgep.od_data_media (obj_id text, path text);
INSERT INTO qgep.od_data_media(obj_id, path) VALUES('toto', 'toto');

CREATE  TABLE qgep.od_file(obj_id text, path_relative text, fk_data_media text);

CREATE OR REPLACE VIEW qgep.vw_file AS 
( SELECT f.obj_id,
    dm.path,
    dm.path::text || f.path_relative::text AS _url
   FROM qgep.od_file f
     LEFT JOIN qgep.od_data_media dm ON dm.obj_id::text = f.fk_data_media::text
);
                        
CREATE OR REPLACE FUNCTION qgep.vw_file_insert()
  RETURNS trigger AS
$BODY$
DECLARE
    _fk character varying(16);
    _path_relative character varying(100);
    _path character varying(100);
BEGIN

-- foreign key
  SELECT 
    dm.obj_id INTO _fk
  FROM 
    qgep.od_data_media dm
  WHERE 
    dm.path like COALESCE (substring(NEW._url, 1, 4),'%');

  INSERT INTO  qgep.od_file(
      obj_id,
      path_relative,
      fk_data_media
      )
  VALUES(
      NEW.obj_id,
      substring(NEW._url,5),
      _fk
      );
  
  RETURN NEW;        
END; $BODY$LANGUAGE plpgsql

CREATE TRIGGER vw_file_insert
  INSTEAD OF INSERT
  ON qgep.vw_file
  FOR EACH ROW
  EXECUTE PROCEDURE qgep.vw_file_insert();

Dernière modification par tumasgiu (Tue 27 February 2018 14:21)

Hors ligne

 

#7 Tue 27 February 2018 14:35

Zakh
Participant occasionnel
Date d'inscription: 23 Jul 2015
Messages: 38

Re: POSTGIS - fonction insert

J'utilise la 2.18, ces tables sont non géométrique. La vue vw_file est ensuite liée par relation à différents objets qui eux sont géométriques (couvercle, tuyau ou autre d'un réseau  d'assainissement).

Le champs _url est renseigné par Ressource externe comme Outil d'édition.

Hors ligne

 

Pied de page des forums

Powered by FluxBB