Pages: 1
- Sujet précédent - Postgis Remplacement chaine de caractères dans plusieurs tables - Sujet suivant
#1 Fri 04 April 2014 10:55
- guibouvier
- Participant actif
- Date d'inscription: 23 Jan 2007
- Messages: 104
Postgis Remplacement chaine de caractères dans plusieurs tables
Bonjour,
je cherche à remplacer de manière automatique une chaine de caractères présente dans un champ de type lien hypertexte présent dans un certain nombre de tables de ma base de données Postgis.
Savez vous si je pourrai lancer une requête qui me parcoure toutes les tables de la BDD à la recherche de la dite chaine et me la remplace automatiquement par une autre.
D'avance merci pour votre aide.
Cordialement
Gui
Hors ligne
#2 Fri 04 April 2014 11:19
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgis Remplacement chaine de caractères dans plusieurs tables
Bonjour,
Pas directement par requete: il faut passer par une fonction (pl/pgsql ou autre) car il faut a la fois chercher les tables, puis les colonnes, et enfin mettre à jour.
Vous connaissez les tables et colonnes qui contiennent les caractères, ou c'est potentiellement toutes les tables et toutes les colonnes ?
Une solution envisageable et rapide (sauf si la base de données est grosse): export de la base avec pg_dump en fichier SQL, puis remplacement du caractere avec un grep ou awk (ou autre commande pratique de manip de chaines/fichier).
Ensuite recharger le dump
Nicolas
Hors ligne
#3 Fri 04 April 2014 11:52
Re: Postgis Remplacement chaine de caractères dans plusieurs tables
Bonjour,
Vous pouvez faire du SQL qui génère du SQL et évitez de sortir la donnée de votre base.
Par exemple, vous pouvez remplacer les accents comme dans l'exemple ci-dessous
select 'UPDATE '||table_name||'.'||column_name||' SET '||table_name||'.'||column_name||'=translate('||table_name||'.'||column_name||',\'àâéèêëîïìôòùûÀÂÉÈÊËÎÏÌÔÒÙÛ\',\'aaeeeeiiioouuAAEEEEIIIOOUU\');' as test
from information_schema.columns
where table_name IN (select tablename from pg_tables where schemaname='public' and tablename<>'spatial_ref_sys')
Pour votre cas, il vous suffit de changer la fonction translate (qui marche de caractère à caractère) par replace (voir la doc http://docs.postgresql.fr/9.3/functions … tring-sql)
Je vous conseille plutôt que de lancer les requêtes générées de faire quelques tests avec des SELECT (le SQL généré ci-dessus met à jour)
Cordialement
Thomas
Hors ligne
#4 Fri 04 April 2014 12:01
- guibouvier
- Participant actif
- Date d'inscription: 23 Jan 2007
- Messages: 104
Re: Postgis Remplacement chaine de caractères dans plusieurs tables
Bonjour,
Vous connaissez les tables et colonnes qui contiennent les caractères, ou c'est potentiellement toutes les tables et toutes les colonnes ?
Nicolas
non effectivement, cela concerne qu'une partie des tables de la BDD, environ une douzaine.
Une solution envisageable et rapide (sauf si la base de données est grosse): export de la base avec pg_dump en fichier SQL, puis remplacement du caractere avec un grep ou awk (ou autre commande pratique de manip de chaines/fichier).
Ensuite recharger le dump
Nicolas
je vais tester cela effectivement, ça pourrait me suffire.
Hors ligne
#5 Fri 04 April 2014 12:17
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgis Remplacement chaine de caractères dans plusieurs tables
Bonjour,
Vous pouvez faire du SQL qui génère du SQL et évitez de sortir la donnée de votre base.
Par exemple, vous pouvez remplacer les accents comme dans l'exemple ci-dessous
Avec l'approche de generation de SQL, il faut bien faire attention aux noms des tables et des colonnes: si la base contient des noms particuliers (espaces, majuscules, char spéciaux, etc), les requetes générées ne vont pas marcher: il faut alors utiliser la fonction quote_ident, qui sait mettre les identifiants entre quotes doubles si nécessaire.
Nicolas
Hors ligne
#6 Fri 04 April 2014 19:09
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3197
- Site web
Re: Postgis Remplacement chaine de caractères dans plusieurs tables
Bonjour,
Pour une douzaine de tables construire une table "temporaire" contenant le nom des tables et le noms des colonnes concernée puis faire un update (WITH RECURSIVE ?).
Ceci dit avec pgcatalog et pg-tables (vue) on obtient le nom des tables après je ne sais plus comment faire la jointure pour avoir le nom des colonnes de chaque table. (Nicola's help needed).
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#7 Thu 10 April 2014 17:47
- guibouvier
- Participant actif
- Date d'inscription: 23 Jan 2007
- Messages: 104
Re: Postgis Remplacement chaine de caractères dans plusieurs tables
Bonjour,
Une solution envisageable et rapide (sauf si la base de données est grosse): export de la base avec pg_dump en fichier SQL, puis remplacement du caractere avec un grep ou awk (ou autre commande pratique de manip de chaines/fichier).
Ensuite recharger le dump
Nicolas
Bonjour,
je reviens vers vous car j'ai pu exporté les tables en SQL et modifier les valeurs du champ en question.
Par contre, question toute bête, comment puis je recharger mon fichier SQL ?
Lorsque j'active restaurer, il me cherche un fichier de type .backup.
Si je charge le fichier SQL dans le panneau SQL, il me met une erreur de syntaxe et rien ne se passe.
D'avance merci pour votre aide
Cordialement
Hors ligne
#8 Fri 11 April 2014 16:35
- guibouvier
- Participant actif
- Date d'inscription: 23 Jan 2007
- Messages: 104
Re: Postgis Remplacement chaine de caractères dans plusieurs tables
Bonjour,
j'ai pu arriver à mes fins.
Merci encore pour votre aide
Hors ligne
Pages: 1
- Sujet précédent - Postgis Remplacement chaine de caractères dans plusieurs tables - Sujet suivant