Pages: 1
- Sujet précédent - Postgresql/postgis : créer des tables à partir d'une liste de tables - Sujet suivant
#1 Fri 02 July 2021 17:02
- tem76
- Participant occasionnel
- Lieu: Orange
- Date d'inscription: 24 Jul 2006
- Messages: 22
Postgresql/postgis : créer des tables à partir d'une liste de tables
Bonjour à tous.
Voici ma problématique :
j'ai, d'un côté, une liste de 6 tables contenant des grilles (10km, 5km, 2km, 1km, 500m et 200m).
De l'autre, j'ai une table d'iris contenant des analyses statistiques.
Je souhaite découper l'une avec l'autre de manière automatique avec un truc du genre :
je créé une table contenant la liste des tables qui me servent à découper ma table des iris :
Code:
drop table if exists temp.liste_grilles_hexagonales; create table temp.liste_grilles_hexagonales (fid serial,nom_table varchar(50)); insert into temp.liste_grilles_hexagonales values (1,'hexagrille_10km'), (2,'hexagrille_5km'), (3,'hexagrille_2km'), (4,'hexagrille_1km'), (5,'hexagrille_500m'), (6,'hexagrille_200m') ;
J'ai créé une fonction qui lit cette première table, découpe les tables et met le résultat de tout ça dans une nouvelle table.
Dans un premier temps, je suis parti d'une boucle juste pour créer une table pour chaque ligne :
Code:
create or replace function temp.lecture_grilles(force_drop int default 0) returns void as $body$ declare echelle record; begin for echelle in select * from temp.liste_grilles_hexagonales loop execute format('drop table if exists %I','temp.'||echelle.nom_table||'_sql'); execute format('create table %I (id serial primary key)','temp.'||echelle.nom_table||'_sql'); end loop; end; $body$ language plpgsql;
Mais cela ne fait rien : pas de table créée...
Auriez-vous une idée ?
Merci d'avance.
Hors ligne
#2 Fri 02 July 2021 17:29
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: Postgresql/postgis : créer des tables à partir d'une liste de tables
Salut,
est ce que les tables ne seraient pas créées dans le schema public par hasard ?
Hors ligne
#3 Fri 02 July 2021 21:08
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: Postgresql/postgis : créer des tables à partir d'une liste de tables
Bonsoir,
Perso, je mettrais toutes les grilles dans la même table.
le croisement pourrait se faire en une seule requete, sans passer par des fonctions.
Et le résultat stocké dans une seule table aussi, quitte à ventiler plus tard dans plusieurs tables
Nicolas
Hors ligne
#4 Mon 05 July 2021 09:05
- tem76
- Participant occasionnel
- Lieu: Orange
- Date d'inscription: 24 Jul 2006
- Messages: 22
Re: Postgresql/postgis : créer des tables à partir d'une liste de tables
Salut,
est ce que les tables ne seraient pas créées dans le schema public par hasard ?
Et bien, effectivement, elles sont dans le schéma "public". Pourtant, j'ai bien mis 'temp.' pour qu'elles aillent dans le schéma 'temp', justement. Quelle erreur ai-je fait ?
Hors ligne
#5 Mon 05 July 2021 09:17
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: Postgresql/postgis : créer des tables à partir d'une liste de tables
Bonjour,
Je me demande si la syntaxe 'temp.'||echelle.nom_table||'_sql' ne génère pas trop de point positionnant temp comme une base de données et non un schéma.
Essayez peut-être de stocker "echelle.nom_table" dans une variable text au sein de la boucle pour la réutiliser dans l'insert afin d’éliminer cette hypothèse.
Bien à vous
Hors ligne
#6 Mon 05 July 2021 10:34
- tem76
- Participant occasionnel
- Lieu: Orange
- Date d'inscription: 24 Jul 2006
- Messages: 22
Re: Postgresql/postgis : créer des tables à partir d'une liste de tables
Bonjour,
Je me demande si la syntaxe 'temp.'||echelle.nom_table||'_sql' ne génère pas trop de point positionnant temp comme une base de données et non un schéma.
Essayez peut-être de stocker "echelle.nom_table" dans une variable text au sein de la boucle pour la réutiliser dans l'insert afin d’éliminer cette hypothèse.
Bien à vous
Ok. Du coup, j'ai créé une variable pour récupérer le nom de la table et ça à l'air de fonctionner :
Code:
create or replace function temp.lecture_grilles(force_drop int default 0) returns void as $body$ declare echelle record; declare nomtable text; begin for echelle in select * from temp.liste_grilles_hexagonales loop nomtable := echelle.nom_table; raise info 'A2 Suppression de la table temp.%_sql',nomtable; execute format('drop table if exists temp.%I',nomtable||'_sql'); execute format('create table temp.%I (id serial primary key)',nomtable||'_sql'); end loop; end; $body$ language plpgsql;
Merci pour l'info.
Par contre, quelle est la différence entre mettre '%' ou mettre '%I' pour récupérer la valeur d'une variable ?
Hors ligne
#7 Mon 05 July 2021 10:41
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: Postgresql/postgis : créer des tables à partir d'une liste de tables
Par contre, quelle est la différence entre mettre '%' ou mettre '%I' pour récupérer la valeur d'une variable ?
Bonjour,
Pour laisser PG formater les identifiants (noms de tables, colonnes, schémas, etc.) comme il faut:
https://www.postgresql.org/docs/13/func … ING-FORMAT
Nicolas
Hors ligne
Pages: 1
- Sujet précédent - Postgresql/postgis : créer des tables à partir d'une liste de tables - Sujet suivant