IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Lister les tables et tester l'existence d'une colonne ?


Sujet :

PostgreSQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Lister les tables et tester l'existence d'une colonne ?
    Bonjour à tous,


    J'aimerais savoir si il y a un moyen de lister toutes les tables de ma base de données PostGres et ensuite parcourir toutes les tables de ma base et tester l'existence de la colonne "MyColonne".

    Actuellement MyColonne est de type "numeric" et j'aimerais la passer sous forme de Integer et multiplier la valeur par 100 ?

    En fait j'ai des tables qui contiennent la colonne "MyColonne" et j'aimerais faire un traitement sous forme de batch qui me permettrait de modifier toutes les colonnes MyColonne de ma base !


    Avez vous une idée ?

    Merci et très bonne journée à tous

  2. #2
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bon en fait j'ai trouvé !

    Pour faire le listing des tables avec schéma !

    select schemaname || '.' ||relname,relid from pg_stat_user_tables order by schemaname asc;

    On aura :

    schema1.tableA,3456
    schema1.tableB,4567
    etc...
    la seconde colonne est un identifiant de table


    Ensuite la requête :

    select attname from pg_attribute where attrelid = 4567 (identifiant ci dessus)

    donne le nom des colonnes de la table !

  3. #3
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 629
    Points : 7 596
    Points
    7 596
    Par défaut
    Ou plus simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select 
    	a.schemaname || '.' || a.relname as "tablename",
    	b.attname as "columnname"
    from pg_stat_user_tables a, pg_attribute b
    where a.relid = b.attrelid
    order by a.schemaname asc;

  4. #4
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Bonjour a tous,

    J'aimerai ré-ouvrir ce sujet plutôt que d'en créer un autre. Je suis en train de développer une application de maintenance de BDD sous PG SQL et PHP. Cette discussion m'a beaucoup servie et j'aurai besoin de plus de précision.
    Pour un souci de sécurité je stocke dans une variable l'état de ma BDD actuel pour prévenir d'un bug au cas ou la structure de la base a changer alors que mon application est toujours la même.
    Je veux donc stocker dans ma variable :
    • Les noms de toutes mes tables

    • Pour chaque table, le nom et le type de chaque champs



    En gros un truc qui ressemble à cela

    $bdd=array(
    'table1 =>
    array('champs1'=> type,
    'champN'=> type),

    tableN =>
    array(...)
    );

    Vous me direz quelle idée vraiment! En faite j'arrive très bien a récupérer mes nom de tables et de champs mais j'ai un problème pour les types car je me sert du champs 'atttypid' de la table 'pg_attribute' qui fait le lien avec la table 'pg_type'. Le problème c'est que pour certain champs il y a plusieurs 'typname' dans la table 'pg_type' pour le même 'atttypid'.
    Je sais pas si je suis très clair.
    En gros ma question c'est comment retrouver simplement les BIGINT, TEXT, TIMESTAMP ....

    Merci d'avance

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    j'ai un problème pour les types car je me sert du champs 'atttypid' de la table 'pg_attribute' qui fait le lien avec la table 'pg_type'. Le problème c'est que pour certain champs il y a plusieurs 'typname' dans la table 'pg_type' pour le même 'atttypid'.
    Je sais pas si je suis très clair.
    En gros ma question c'est comment retrouver simplement les BIGINT, TEXT, TIMESTAMP ....
    Laisse tomber pg_type et utilise plutôt la fonction préféfinie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pg_catalog.format_type(pg_attribute.atttypid, pg_attribute.atttypmod)

  6. #6
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Thanks!

    Génial cette fonction c'est exactement ce que je voulais! Je me suis bien embêter avec ces paramètres qui mènent a rien.

    Encore merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/10/2010, 10h31
  2. Tester l'existence d'une colonne dans une table
    Par caps_corp dans le forum Access
    Réponses: 4
    Dernier message: 05/06/2006, 17h31
  3. [ODBC] Intranet en PHP : Lister les tables d'une base Access
    Par fblouet dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/10/2003, 14h46
  4. Lister les tables d'une Base
    Par YanK dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 08/10/2003, 10h40
  5. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo