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 24 June 2014 14:34

dungeonkeeper81
Participant actif
Lieu: Lausanne
Date d'inscription: 12 Jan 2011
Messages: 70
Site web

QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Bonjour,

J'ai modélisé une relation un à plusieurs dans QGIS pour des données stockées dans PostGIS.

Ça fonctionne pas trop mal, hormis un petit soucis d'identifiant que je n'arrive pas à utiliser en type serial.

C'est là que vous allez peut-être pouvoir m'aider.

Si ça vous intéresse, je vous présente ma démarche et si vous avez des propositions d'améliorations, je suis preneur.

Je n'ai pas trouvé de tutoriels complet sur le web.



Contexte

Il s'agit de modéliser des tronçons (axes) routiers et de leurs assigner un ou plusieurs rapports de mesures acoustiques.


Données de base

- des tronçons routiers (table troncon, type données géométriques)

- des rapports de mesures acoustiques (table mesure, type données attributives)


Modèle de données

[img]http://img4.hostingpics.net/pics/928990mcd.jpg[/img]

Impossible d'utiliser troncon.id en type serial.

QGIS génére un message d'erreur car mesure.fk_troncon est de type integer.

Comment pourrais-je résoudre ce problème ?


Implémentation dans PostGIS/PostgreSQL

J'ai implémenté le modèle ci-dessus avec une contrainte de clef étrangère sur la table mesure.

ALTER TABLE mesure
  ADD CONSTRAINT fk_troncon FOREIGN KEY (fk_troncon)
      REFERENCES troncon (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION;


Implémentation dans QGIS

J'ai défini dans les propriétés du projet la relation suivante:

[img]http://img4.hostingpics.net/pics/336645propriete.jpg[/img]


Exploitation

Hormis un bug d'affichage des données au moment de leur création, la saisie dans QGIS est fonctionnelle.

Cependant la gestion des ID de la table troncon doivent se faire manuellement sad

[img]http://img4.hostingpics.net/pics/152703carte.jpg[/img]

Dernière modification par dungeonkeeper81 (Tue 24 June 2014 14:37)

Hors ligne

 

#2 Tue 24 June 2014 15:30

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

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Salut,

si j'ai bien compris, troncon.id est de [pseudo]type serial.
Tu peux changer son type en integer et changer sa valeur par défaut comme suit :

Code:

ALTER TABLE troncon ALTER COLUMN id
        SET DEFAULT nextval('seq_troncon'::regclass);

ou seq_troncon est le nom de la séquence liée a à colonne troncon.id.

Hors ligne

 

#3 Tue 24 June 2014 16:59

dungeonkeeper81
Participant actif
Lieu: Lausanne
Date d'inscription: 12 Jan 2011
Messages: 70
Site web

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Salut,

Merci pour cette information mais là n'est pas le problème.

J'ai déjà testé le type serial pour l'attribut troncon.id.

Dans ce cas de figure QGIS refuse les nouveaux enregistrement qui dépendent de cette clef.

Le message d'erreur indique que le type integer de l'attribut mesure.fk_troncon n'est pas compatible avec le type serial de l'attribut troncon.id.

Je ne sais pas quel type attribuer à la clef étrangère (mesure.fk_troncon) pour que cela fonctionne.

Hors ligne

 

#4 Tue 24 June 2014 21:18

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

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Salut,

ce que je te propose de faire c'est de convertir troncon.id en int

Code:

ALTER TABLE troncon ALTER Column id type integer

tu conservera l’incrémentation automatique de ta clef primaire et plus de problème de compréhension de la part de QGIS.

Dernière modification par tumasgiu (Tue 24 June 2014 21:20)

Hors ligne

 

#5 Wed 25 June 2014 13:56

dungeonkeeper81
Participant actif
Lieu: Lausanne
Date d'inscription: 12 Jan 2011
Messages: 70
Site web

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Merci pour les pistes tumasgiu, j'ai résolu mon problème grâce à vous.

J'ai défini troncon.id en type integer et je lui ai attribué une séquence

id integer NOT NULL DEFAULT nextval('troncon_id_seq'::regclass),

Il n'y a plus de problème de typage.

Et logiquement il faut enregistrer l'objet "parent" avant de lui assigner des données "enfants", sinon ça coince avec la valeur.

[img]http://img4.hostingpics.net/pics/377059nextval.png[/img]

Hors ligne

 

#6 Mon 19 January 2015 12:04

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1220
Site web

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Bonjour à tous,

je remonte ce sujet car je suis confronté au même "problème".

Pour reprendre l'exemple de dungeonkeeper81, j'aimerai pouvoir créer un tronçon et les mesures qui y font référence dans le même formulaire, sans devoir d'abord créer le tronçon.

Quelqu'un a-t-il une solution ? Ça nécessite que QGis récupère la valeur de la séquence attribuée au tronçon et la répercute dans les différentes lignes de la table mesure, créées en relation avec ce tronçon...

Merci d'avance pour vos retours éventuels.


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#7 Mon 19 January 2015 13:15

Sylvain PIERRE
Participant assidu
Lieu: Strasbourg
Date d'inscription: 6 Sep 2005
Messages: 170

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Bonjour,

En remontant le file de la discussion (que je découvre) une remarque pour commencer:
Le type "serial" dans postgres/postgis n'est qu'un artifice créé pour simplifier la tache des gestionnaire de base de données.
En choisissant ce type cela créé automatiquement une clé primaire et une séquence.
Dans les faits si l'on veut créer proprement une clé primaire, il vaut mieux (c'est plus long mais on maitrise tout):
1 La séquence

Code:

CREATE SEQUENCE crue_interv_id_seq...

2 La table

Code:

CREATE TABLE crue_interv
(
  id integer NOT NULL DEFAULT nextval('crue_interv_id_seq'::regclass),
….
CONSTRAINT crue_interv_fk_crue_fkey PRIMARY KEY (id)
)

Sinon pour votre question, un trigger ne serait-il pas une piste à explorer?
On peut vraiment gérer pas mal de choses côté SGBD

Sylvain

Hors ligne

 

#8 Mon 19 January 2015 13:46

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1220
Site web

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Bonjour Sylvain,

merci pour votre réponse. Ma clé primaire est un bien un "integer" avec une valeur par défaut issue de la séquence.

Mon soucis ne se situe pas "coté base de données" mais bien du coté de QGis. Dans l’idéal, il faudrait que QGis insère la donnée référencée en base, récupère l'identifiant attribué à la ligne nouvellement créée et la répercute dans la clé étrangère des lignes filles.

Pour l'instant, j'ai beau retourner le problème dans tous les sens, je ne vois pas de solution (non programmée) me permettant d'utiliser un seul formulaire.


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#9 Mon 19 January 2015 14:53

Sylvain PIERRE
Participant assidu
Lieu: Strasbourg
Date d'inscription: 6 Sep 2005
Messages: 170

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Je reste persuadé que ça peut se gérer côté BD:
Cela implique de gérer un peu de manière différente la saisie côté QGIS.
Au moment de l'INSERT d"un nouveau tronçon, le TRIGGER insert le nombre d'enregistrements dans les tables liées par la FK.
Ensuite ce n'est plus de la saisie, mais un UPDATE des info insérées par le TRIGGER

Hors ligne

 

#10 Thu 23 January 2020 19:41

fabien_sig
Juste Inscrit !
Date d'inscription: 11 Jun 2018
Messages: 2

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Bonjour,

Je rencontrer le même problème sur la version Qgis 3.10.

ERREUR: syntaxe en entrée invalide pour l'entier : « nextval(....) » au sein de la table intermédiaire.

Quelqu'un a t'il trouvé une solution ?

Hors ligne

 

#11 Fri 24 January 2020 07:11

aguenec
Participant occasionnel
Lieu: Bretagne
Date d'inscription: 13 Sep 2014
Messages: 37

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Bonjour,

Voir cette discussion (https://georezo.net/forum/viewtopic.php?id=106599) qui évoque le sujet avec la solution suivante : Projet > Propriétés > Source de données > Cocher la case évaluer les valeurs par défaut depuis le fournisseur de données.

Bonne journée

Antoine

Hors ligne

 

#12 Mon 27 January 2020 14:13

fabien_sig
Juste Inscrit !
Date d'inscription: 11 Jun 2018
Messages: 2

Re: QGIS 2.2: Comment bien modeliser une relation 1-N avec PostGIS

Bonjour et Merci Antoine,
Le problème est partiellement résolu.
Bonne journée

Hors ligne

 

Pied de page des forums

Powered by FluxBB