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

Requêtes PostgreSQL Discussion :

Noms des tables entre guillemets dans une requête


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut Noms des tables entre guillemets dans une requête
    Bonjour,

    Je ne comprends pas pourquoi Postgres demande à mettre le nom des tables entre guillemets dans les requêtes. Sinon, il ne reconnait pas le nom des objets table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERREUR:  la relation « MA_TABLE » n'existe pas
    LINE 1: SELECT * FROM MA_TABLE;
    J'aimerais exécuter mes requêtes sans ces guillemets comme dans n'importe quel autre SGBD.

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Cette table est dans quel schéma?
    Quelle interface utilises-tu?
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Vous avez surement créé votre table de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create table "MA_TABLE" ...

    De ce fait, postgres a enregistré le nom de la table en majuscules.

    Quand vous interrogez cette table, vous devez donc l'encadrer de guillemets pour que postgres ne traduise pas le nom de la table en minuscules.


    Vous pouvez vérifier ceci en regardant les données de cette table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from pg_tables

  4. #4
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    Merci pour vos réponses.

    Citation Envoyé par alassanediakite Voir le message
    Salut
    Cette table est dans quel schéma?
    Quelle interface utilises-tu?
    @+
    Bonjour, c'est le schéma "public", j'ai utilisé PgAdmin 3.

    Citation Envoyé par punkoff Voir le message
    bonjour,

    Vous avez surement créé votre table de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create table "MA_TABLE" ...

    De ce fait, postgres à enregistré le nom de la table en majuscule.

    Quand vous interrogez cette table vous devez donc l'encadré de guillemet pour que postgres ne traduise pas le nom de la table ne minuscule.


    Vous pouvez vérifier ceci en regardant les données de cette table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from pg_tables
    Mince... Peut-on revenir en arrière dans ce cas ? Pourtant quand j'exécute votre requête, le nom des tables n'est pas entre guillemets.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Soit, mais le nom de la table est en minuscules ou majuscules ?

    Quand on ne met pas de guillemets, le nom est transcrit en minuscules.

    Avec les guillemets celui-ci est laissé tel quel.

  6. #6
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    Les noms sont en majuscules parce que j'ai nommé les tables ainsi.

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    non, car vous avez créé les tables avec le nom entre guillemet.

    Faites le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    create table TT (id int);
     
    select * from pg_tables where schemaname = 'public';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Resultat :
    public;	matable;	postgres;;f;f;f
    public;	service;	postgres;;f;f;f
    public;	note;	postgres;;f;f;f
    public;	tt;	postgres;;f;f;f

  8. #8
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    C'est pgAdmin 3 qui a donc ajouté les guillemets à ma place !! Bravo...

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    moué bof, j'utilise pgadmin et il ne rajoute rien de spécial quand on exécute une requête sql

  10. #10
    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
    Citation Envoyé par KibitO Voir le message
    C'est pgAdmin 3 qui a donc ajouté les guillemets à ma place !! Bravo...
    Oui. Voir ce fil de discussion:

    http://www.developpez.net/forums/d88...non-existante/

  11. #11
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    Merci à vous. Vous me conseillez de faire quoi du coup ? Renommer mes tables en minuscules et d'adapter mon code ?

  12. #12
    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
    Renommer les tables en minuscules est la meilleure chose à faire, ça revient à la situation où elles n'auraient pas été créées avec des guillemets dans le CREATE TABLE.

    C'est faisable globalement avec une requête comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    DO $$
    DECLARE
      tablename text;
      schemaname text;
    BEGIN
      FOR schemaname,tablename in select table_schema,table_name
        FROM information_schema.tables 
        WHERE table_name<>lower(table_name)
      LOOP
        execute format('ALTER TABLE %I.%I RENAME TO %I',
           schemaname,
           tablename,
           lower(tablename));
      END LOOP;
    END;
    $$ LANGUAGE plpgsql;
    Éventuellement, ajouter une restriction sur schemaname si ça ne doit pas prendre en compte tous les schémas.
    Le même genre de choses est faisable pour les colonnes si nécessaire (voir information_schema.columns)

    Une fois renommé, on peut écrire indifféremment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * from MA_TABLE;
    select * from ma_Table;
    select * from Ma_Table;
    select * from ma_table;
    etc...

  13. #13
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    Merci beaucoup ! Je teste tout de suite sur les tables et les champs de certaines tables.

  14. #14
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    Si je veux que ça n'affecte que le schema "public", je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DO $$DECLARE
      tablename text;
      schemaname text;
    BEGIN
      FOR schemaname,tablename IN SELECT table_schema,table_name
        FROM information_schema.TABLES 
        WHERE table_name<>lower(table_name)
      LOOP
        schemaname,
           tablename,
           lower(tablename));
      END LOOP;
    END; $$ LANGUAGE plpgsql;
    ?

  15. #15
    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
    Il suffit d'ajouter le filtre sur schéma à la clause where, c.a.d

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE table_name<>lower(table_name)
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE table_name<>lower(table_name) AND table_schema='public'
    Plus généralement on peut aussi ne faire qu'afficher les renommages au lieu de les exécuter pour contrôler visuellement et faire le tri si nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    DO $$
    DECLARE
      tablename text;
      schemaname text;
      stmt text;
    BEGIN
      FOR schemaname,tablename IN SELECT table_schema,table_name
        FROM information_schema.TABLES 
        WHERE table_name<>lower(table_name)
      LOOP
        stmt:=format('ALTER TABLE %I.%I RENAME TO %I',
           schemaname,
           tablename,
           lower(tablename));
         raise info '%;', stmt;
      END LOOP;
    END;
    $$ LANGUAGE plpgsql;

  16. #16
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    OK. Par contre j'essaie d'exécuter la requête dans PgAdmin mais il me met une erreur à la ligne 1. Il n'aime pas trop les $$.

  17. #17
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    il faut lancer une execution de pgscript il me semble. le bouton juste à côté

    nan rien

  18. #18
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    J'essaie mais du coup je n'ai pas l'explication de l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    DO $$DECLARE
      tablename text;
      schemaname text;
    BEGIN
      FOR schemaname,tablename IN SELECT table_schema,table_name
        FROM information_schema.TABLES 
        WHERE table_name<>lower(table_name)AND table_schema='public'
      LOOP
        execute format('ALTER TABLE %I.%I RENAME TO %I',
           schemaname,
           tablename,
           lower(tablename));
      END LOOP;
    END;
    $$ LANGUAGE plpgsql;
    [ERROR ] 1.0: syntax error, unexpected character

  19. #19
    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
    Ca doit être plutôt que le DO... n'existe pas en 8.4, c'est à partir de 9.0

    Il faudrait donc mettre le bloc de code dans une fonction plpgsql.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE FUNCTION nomfonction() returns void AS $$... $$ language plpgsql
    et l'appeler avec SELECT nomfonction();

  20. #20
    Membre confirmé Avatar de KibitO
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2004
    Messages : 616
    Points : 606
    Points
    606
    Par défaut
    Ok merci je testerai comme ça.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/06/2015, 19h59
  2. [phpMyAdmin] Passer le nom d'une table en variable dans une requête avec phpMyAdmin
    Par EnRadeSurEclipse dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 29/09/2014, 12h49
  3. Problème avec des guillemets dans une requête
    Par clairetj dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/04/2011, 12h39
  4. Faire du nom de la table un paramètre dans une requête
    Par sofiane1111 dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/09/2007, 15h27
  5. problème des guillemets dans une requête
    Par Smix007 dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/04/2007, 18h09

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