Re: [OSM-talk-fr] OSM et postgresql
Le 04/04/2019 à 21:26, Tony Emery via Talk-fr a écrit : Merci pour cette astuce Denis mais, tu pourrais m'expliquer en détail ta solution pour que je comprenne comment elle fonctionne ? L'idée est de fabriquer des requêtes ; c'est ce qui est contenu dans les parenthèses du concat. On va puiser les informations nécessaires dans les tables systèmes (pg_class qui liste toutes les tables, pg_namespace qui contient les schémas, et pg_attribute qui recense les attributs). On relie les tables systèmes avec les clés qu'elles ont en commun (voir la doc). On cantonne la génération de ces requêtes à toutes les tables qui ont un attribut qui contient ':'. On pourrait encore restreindre à un schéma particulier Admettons qu'on ait une table toto créée ainsi : CREATE TABLE monschema.toto (id serial, "addr:housenumber" text); la requête : select concat('ALTER TABLE ',nspname,'.',t.relname,' RENAME COLUMN "',a.attname,'" TO "',replace(a.attname,':','_'),'";') from pg_attribute a join pg_class t on a.attrelid=t.oid join pg_namespace n on t.relnamespace=n.oid where attname like '%:%' and nspname='monschema'; donnera le résultat suivant ALTER TABLE monschema.toto RENAME COLUMN "addr:housenumber" TO "addr_housenumber"; si tu rediriges le résultat de la requête plus haut vers une sortie texte, tu obtiens un fichier SQL que tu peux lancer avec psql, par exemple. En espérant avoir été clair, sinon on continue en privé Denis, désolé pour la foule non SQLphile --- L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast. https://www.avast.com/antivirus ___ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr
Re: [OSM-talk-fr] OSM et postgresql
Merci pour cette astuce Denis mais, tu pourrais m'expliquer en détail ta solution pour que je comprenne comment elle fonctionne ? - Tony EMERY Administrateur OpenStreetMap.fr Ingénieur SIG -- Sent from: http://gis.19327.n8.nabble.com/France-f5380434.html ___ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr
Re: [OSM-talk-fr] OSM et postgresql
Merci pour cette astuce Denis mais, tu pourrais m'expliquer en détail ta solution pour que je comprenne comment elle fonctionne ? - Tony EMERY Administrateur OpenStreetMap.fr Ingénieur SIG -- Sent from: http://gis.19327.n8.nabble.com/France-f5380434.html ___ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr
Re: [OSM-talk-fr] OSM et postgresql
Magnifique ton astuce Denis j'aime bien et je la note ! Ça fait longtemps que j'ai pas joué avec les méta-tables de PostgreSQL, ça me rappelle quelques souvenirs. :-) Sinon une petite remarque pour Tony c'est possible d'exploiter les colonnes avec des caractères comme : il suffit d'entourer le nom de la colonne par des "" dans la requête. Un exemple : SELECT * FROM osm_hydrants WHERE "fire_hydrant:type" = 'pillar'; Après je suis d'accord que c'est quand même un peu pénible... Nicolas Le 04/04/2019 à 17:55, HELFER Denis (SNCF RESEAU / SIEGE SNCF RESEAU / DT GE PPE) a écrit : Tu peux utiliser https://docs.postgresql.fr/8.1/catalog-pg-attribute.html pour identifier les colonnes concernées La requête suivante va te générer les requêtes qui vont bien : select concat('ALTER TABLE ',nspname,'.',t.relname,' RENAME COLUMN "',a.attname,'" TO "',replace(a.attname,':','_'),'"') from pg_attribute a join pg_class t on a.attrelid=t.oid join pg_namespace n on t.relnamespace=n.oid where attname like '%:%'; Denis ___ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr
Re: [OSM-talk-fr] OSM et postgresql
Bonsoir, En m’inspirant de cette méthode : https://stackoverflow.com/a/39096027 j’ai essayé ça avec succès dans psql, sur des tables temporaires du schéma pg_temp_4 : > BEGIN; > SELECT FORMAT( 'ALTER TABLE %I RENAME TO %I', table_name, regexp_replace(table_name, ':', '_') ) FROM information_schema.tables WHERE table_schema='pg_temp_4'; > \gexec > \dt pg_temp_4.* > COMMIT; (ou ROLLBACK si ça plante ;-) ) Gwenaël Le 04/04/2019 à 17:30, Tony Emery via Talk-fr a écrit : > Bonjour à tous, > > J'ai une petite question technique concernant l'exploitation des clés > OpenStreetMap dans PosgreSQL. > Je voudrais modifier le noms des colonnes qui contiennent des ":" en les > remplaçant par des "_", par exemple. > > Et plutôt que d'avoir des "ALTER TABLE public.habillage_osm_point RENAME > COLUMN "addr:housenumber" TO "addr_housenumber"; et faire ça pour chaque > clé, je voudrais avoir : > "Bon, Postgresql, à chaque fois que tu vois un ":" dans le nom d'une colonne > de la table public.habillage_osm_point, tu le remplaces par "_" et avec le > sourire s'il te plait". > > Je suppose qu'il faut une petite fonction avec une boucle mais je ne vois > pas bien comment la monter. > > Merci d'avance, > > > > - > Tony EMERY > Administrateur OpenStreetMap.fr > Mandataire Grand Sud-Est > Géomaticien & chef de projets > -- > Sent from: http://gis.19327.n8.nabble.com/France-f5380434.html > > ___ > Talk-fr mailing list > Talk-fr@openstreetmap.org > https://lists.openstreetmap.org/listinfo/talk-fr > ___ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr
Re: [OSM-talk-fr] OSM et postgresql
Tu peux utiliser https://docs.postgresql.fr/8.1/catalog-pg-attribute.html pour identifier les colonnes concernées La requête suivante va te générer les requêtes qui vont bien : select concat('ALTER TABLE ',nspname,'.',t.relname,' RENAME COLUMN "',a.attname,'" TO "',replace(a.attname,':','_'),'"') from pg_attribute a join pg_class t on a.attrelid=t.oid join pg_namespace n on t.relnamespace=n.oid where attname like '%:%'; Denis -Message d'origine- De : Tony Emery via Talk-fr [mailto:talk-fr@openstreetmap.org] Envoyé : jeudi 4 avril 2019 17:31 À : talk-fr@openstreetmap.org Cc : Tony Emery Objet : [OSM-talk-fr] OSM et postgresql Bonjour à tous, J'ai une petite question technique concernant l'exploitation des clés OpenStreetMap dans PosgreSQL. Je voudrais modifier le noms des colonnes qui contiennent des ":" en les remplaçant par des "_", par exemple. Et plutôt que d'avoir des "ALTER TABLE public.habillage_osm_point RENAME COLUMN "addr:housenumber" TO "addr_housenumber"; et faire ça pour chaque clé, je voudrais avoir : "Bon, Postgresql, à chaque fois que tu vois un ":" dans le nom d'une colonne de la table public.habillage_osm_point, tu le remplaces par "_" et avec le sourire s'il te plait". Je suppose qu'il faut une petite fonction avec une boucle mais je ne vois pas bien comment la monter. Merci d'avance, - Tony EMERY Administrateur OpenStreetMap.fr Mandataire Grand Sud-Est Géomaticien & chef de projets -- Sent from: http://gis.19327.n8.nabble.com/France-f5380434.html ___ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr --- Ce message et toutes les pièces jointes sont établis à l'intention exclusive de ses destinataires et sont confidentiels. L'intégrité de ce message n'étant pas assurée sur Internet, la SNCF ne peut être tenue responsable des altérations qui pourraient se produire sur son contenu. Toute publication, utilisation, reproduction, ou diffusion, même partielle, non autorisée préalablement par la SNCF, est strictement interdite. Si vous n'êtes pas le destinataire de ce message, merci d'en avertir immédiatement l'expéditeur et de le détruire. --- This message and any attachments are intended solely for the addressees and are confidential. SNCF may not be held responsible for their contents whose accuracy and completeness cannot be guaranteed over the Internet. Unauthorized use, disclosure, distribution, copying, or any part thereof is strictly prohibited. If you are not the intended recipient of this message, please notify the sender immediately and delete it. ___ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr
[OSM-talk-fr] OSM et postgresql
Bonjour à tous, J'ai une petite question technique concernant l'exploitation des clés OpenStreetMap dans PosgreSQL. Je voudrais modifier le noms des colonnes qui contiennent des ":" en les remplaçant par des "_", par exemple. Et plutôt que d'avoir des "ALTER TABLE public.habillage_osm_point RENAME COLUMN "addr:housenumber" TO "addr_housenumber"; et faire ça pour chaque clé, je voudrais avoir : "Bon, Postgresql, à chaque fois que tu vois un ":" dans le nom d'une colonne de la table public.habillage_osm_point, tu le remplaces par "_" et avec le sourire s'il te plait". Je suppose qu'il faut une petite fonction avec une boucle mais je ne vois pas bien comment la monter. Merci d'avance, - Tony EMERY Administrateur OpenStreetMap.fr Mandataire Grand Sud-Est Géomaticien & chef de projets -- Sent from: http://gis.19327.n8.nabble.com/France-f5380434.html ___ Talk-fr mailing list Talk-fr@openstreetmap.org https://lists.openstreetmap.org/listinfo/talk-fr