#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: 1160
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: 1160
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: 1160
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