GSoC pgAdmin : pgScript

Deuxième GSoC de pgAdmin, l'intégration de pgScript. Ce dernier est un outil permettant de réaliser de petits scripts mêlés avec des requêtes SQL. En effet, les langages style PL/pgsql demandent forcément la création d'une fonction. Or il se trouve des cas où créer une fonction n'a pas réellement un grand intérêt. Prenons un exemple que je viens tout juste d'avoir sur le canal IRC #postgresqlfr. Une personne a demandé comment modifier automatiquement tous les propriétaires des tables d'un schéma. Il n'existe pas vraiment de solutions en dehors d'exécuter la commande ALTER TABLE sur chaque table. Le plus simple est de créer un petit script Bash ou Python pour cela. Maintenant, il sera aussi possible de créer un script pgscript.

Tout se passe encore une fois dans l'outil de requêtage :

gsoc_pgscript.png

Le script se rédige au même endroit que les requêtes SQL (bloc 1 dans la capture d'écran). Le code que j'ai placé se comprend assez facilement. Je lance la requête sur pg_tables, récupère toutes les lignes dans la variable tables, et parcours cette table dans une boucle while. Oui, je suis malheureusement obligé de faire aussi un count(*) pour récupérer le nombre de résultats, c'est très con et malheureusement c'est pas le seul truc très con dans cet outil. Ensuite je lance un ALTER TABLE pour chaque table récupérée.

Le bloc 2 indique la nouvelle icône qui permettra d'exécuter un pgScript. En cliquant dessus, le script est exécuté et le résultat s'affiche dans le bloc 3.

Voilà, c'est tout simple. Quel intérêt par rapport à Python ou Perl ou $SCRIPTLANGUAGE ? aucune idée. Peut-être plus simple pour l'installation (il suffit d'installer pgAdmin, pas le langage Python, le module pyscopg2? etc). Mais ça fait un langage de plus à apprendre... alors quel intérêt ? J'avoue que je ne comprends pas vraiment. Il me semble bien plus simple de lancer un petit script bash du style :

 psql -AtF ";" -c "select tablename from pg_tables where schemaname='public'" test | while read table
 do
   echo "alter table $table owner to postgres;"
 done | psql test

On pourrait aussi se dire que, après tout, c'est un langage de plus, donc du positif. Pas si sûr... parce que, maintenant, il va falloir le maintenir.

PS : Oui, je sais qu'une réponse plus intéressante pour cet utilisateur est d'utiliser REASSIGN OWNED. C'est d'ailleurs ce que j'ai fait.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet