#1 Mon 24 July 2017 11:44
- guil31
- Participant actif
- Date d'inscription: 22 Jan 2013
- Messages: 79
Tests de non regression - Différentiel entre 2 bases
Bonjour,
Je souhaite effectuer le différentiel entre 2 bases de données pour faire des tests de non régression sur mon code python/postgresql.
Les identifiants ne sont pas forcément identiques dans les 2 bases mais la géométrie doit rester stable. Je dois donc me baser sur cette géométrie pour reconnaitre un objet dans les 2 bases. Toutes les autres données attributaires doivent rester stables et c'est ce qu'il faut vérifier.
Donc je souhaite repérer:
- les objets ajoutés
- les objets supprimés
- les modifications attributaires d'un même objet géométrique (qui peut être de type nœud, ligne ou polygone)
J'ai trouvé un ancien post qui évoque un outil de l'IGN (http://logiciels.ign.fr/?-Differentiel,4-)
Cet outil semble intéressant mais j'ai une erreur lorsque je l'exécute en commande en ligne sur des tables postgis.
L'erreur est la suivante: la fonction extent(geometry) n'existe pas
=> Que signifie cette erreur?
Sinon, plutôt que de réinventer la roue, je me dis que ce type d'outil doit bien exister .... Mais mes recherches n'aboutissent pas.
Sinon, une fonction de comparaison de deux tables en se basant sur la géométrie me serait très utile, car je peux encapsuler ça dans du code python.
=> Si quelqu'un a des pistes cela m'intéresse
Claire
Hors ligne
#2 Mon 24 July 2017 12:19
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Tests de non regression - Différentiel entre 2 bases
Bonjour,
Le message d'erreur doit venir du fait que l'outil est vieux et utilise des noms de fonctions qui ne sont plus supportés par défaut: extent() a été remplacé par st_extent() par ex.
Vous pouvez installer les anciens noms de fonctions en exécutant le fichier legacy.sql qui se trouve dans le répertoire d'installation de Postgis.
Nicolas
Hors ligne
#3 Mon 24 July 2017 12:46
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: Tests de non regression - Différentiel entre 2 bases
Salut,
pour le fun, peut être qu'on peut faire çà en pur SQL :
Pour la partie ajout/suppresion, des OUTER JOINS font l'affaire :
Code:
SELECT 'création' err, NULL a_id, NULL a_geom, b.id b_id, b.geom b_geom, NULL modifs FROM A RIGHT JOIN B ON st_equals(A.geom, B.geom) where A.id is NULL UNION SELECT 'suppression', a.id, a.geom, NULL, NULL, NULL FROM A LEFT JOIN B ON st_equals(A.geom, B.geom) where B.id is NULL
Pour ce qui est des modifications sur les données attributaires:
On peut utiliser une comparaison par ligne.
A noter que cette comparaison ignore les champs nuls.
Code:
UNION SELECT 'données modifiées', a.id, a.geom, b.id, b.geom, NULL FROM A INNER JOIN B ON st_equals(A.geom, B.geom) WHERE (a.colA, a.colB...etc) <> (b.colA, b.colB....etc)
Référence : https://www.postgresql.org/docs/9.6/sta … isons.html
Une autre solution pourrait être d'utiliser l'extension hstore, qui permet de gérer des données de type clef valeur :
Code:
UNION SELECT 'données modifiées', a_id, a_geom, b_id, b_geom, modifs FROM (SELECT a.id a_id, a.geom a_geom, b.id b_id, b.geom b_geom, hstore_to_array((hstore(A) - 'id'::text - 'geom'::text) -(hstore(B) - 'id'::text - 'geom'::text)) modifs FROM A INNER JOIN B ON st_equals(A.geom, B.geom) ) foo WHERE array_length(modifs, 1) > 0;
La fonction hstore() permet de créer un hstore à partir d'un record.
L'opération hstore - 'text' supprime la clef correspondante à 'text' dans le hstore.
L'opération hstore - hstore supprime les couples de l'opérande de droite existant dans l'opérande de gauche.
Référence : https://www.postgresql.org/docs/9.6/static/hstore.html
On peut rendre la requête un peu plus élégante :
Code:
SELECT * FROM ( SELECT A.id a_id, A.geom a_geom, B.id b_id, B.geom b_geom, CASE WHEN A.id IS NOT NULL and B.id IS NOT NULL THEN hstore_to_array((hstore(A) - 'id'::text - 'geom'::text) -(hstore(B) - 'id'::text - 'geom'::text)) ELSE NULL END modifs FROM A FULL OUTER JOIN B ON st_equals(A.geom, B.geom) ) foo WHERE modifs IS NULL OR array_length(modifs, 1) > 0;
Dernière modification par tumasgiu (Mon 24 July 2017 13:09)
Hors ligne
#4 Mon 31 July 2017 08:49
- guil31
- Participant actif
- Date d'inscription: 22 Jan 2013
- Messages: 79
Re: Tests de non regression - Différentiel entre 2 bases
Bonjour,
Je suis désolé de ne répondre que maintenant mais j'ai du passer sur un autre sujet dans mon travail.
J'ai essayé la solution de Nicolas pour utiliser l'outil différentiel de l'IGN.
legacy.sql permet bien de passer outre l'erreur: la fonction extent(geometry) n'existe pas
Par contre les résultats ne sont pas ceux escomptés.
Je fais une identification sur le champ geom de données de type ponctuelle.
Le différentiel sort tous les points en objets supprimés et tous les points en objets crées.
Il faut donc que j'investisse plus pour trouver d'où vient le problème.
Je garde la solution de tumasgiu sous le coude.
Claire
Hors ligne
#5 Mon 31 July 2017 10:57
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: Tests de non regression - Différentiel entre 2 bases
Bonjour,
A titre professionnel, nous utilisons Toad Data Point. Cet outil a un générateur de script de comparaison entre table/bases. Une recherche qwant sur les mots clés "data compare" donne aussi d'autres résultats d'acteurs logiciel sur le marché. En effet, peut-être ne vaut-il pas de réinventer la roue.
Sinon pour al solution SQL, passez-vous par des dblinks entre les deux bases ?
Cordialement
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#6 Mon 31 July 2017 11:31
- n314
- Participant assidu
- Date d'inscription: 6 Sep 2005
- Messages: 706
Re: Tests de non regression - Différentiel entre 2 bases
Au cas où, une autre approche.
J'ai des souvenirs de concepts de https://fr.wikipedia.org/wiki/Fonction_de_hachage (md5 est un exemple) qui s'appliquent à la géométrie, à partir d'une géométrie on obtient une empreinte/clé/signature/condensat unique.
A ne pas confondre cependant avec https://fr.wikipedia.org/wiki/Geohash.
Exemple de début de recherche
https://gis.stackexchange.com/questions … r-gis-data
https://knowledge.safe.com/questions/24 … h-fme.html
https://github.com/pkinney/spatial_hash_ex
https://trac.osgeo.org/postgis/ticket/1014
Géométrie-> ToText -> Hash du texte -> stockage du condensat -> comparaison des condensats
ou
https://smathermather.com/2009/10/22/un … continued/
Hors ligne