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


