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 :

premier pas... un peu bizarre


Sujet :

PostgreSQL

  1. #1
    Nouveau Candidat au Club
    premier pas... un peu bizarre
    Bonjour

    C'est la premiere fois que j'utilise PostgreSQL.
    Je connaisais deja mysq,access et oracle

    et je crois avoir un probleme qui m'est inedit.
    Je ne pense pas que ca soit dur a résoudre, certainement une astuce a connaitre.

    Voila je travail sous Eclipse3 en pilote JDBC ainsi que EMS PostgreSQL Manager pour gerer mes bases.

    Je me connecte sans problème mais je suis surpris de la forme que doivent prendre mes requetes pour qu'elles marchent.

    exemple:
    String req = "select \"INFOS\".\"INF_NOM\" from db.\"INFOS\"";

    ce qui me fait : select nomdetable.nomchamp from nomduschema.nomtable .
    tout cela sans oublier les guillemets qui ne sont pas la pour decorer.

    Pour les guillements je viens de comprendre que c'est pour permettre de differencier minuscule et majuscule... c'est a mon gout un peu barbare comme methode mais bon.


    Si quelqu'un peut mexpliquer comment me debarasser du fait de mettre le nom du schema avant le nom de la table et de trouver une parade à la methode tout en minuscule. merci d'avance

  2. #2
    Membre habitué
    Si les tables sont dans le schéma public alors tu n'as pas besoin de le préciser.
    Pour le nom de la table c'est pareil : il est optionnel si les nom des champs ne sont pas ambigüs c'est-à-dire uniques.

    Par contre pour les majuscules je ne crois pas qu'il y est de parades.

  3. #3
    Expert éminent
    Bonjour,

    pour les schémas, quand aucun nom de schéma n'est utilisé en préfixe dans une requête, Postgres recherche l'objet dans le schéma "public", puis dans l'éventuel schéma portant le même nom que l'utilisateur responsable de la transaction. Il est possible de modifier ce comportement, en modifiant la variable seach_path :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SET search_path TO ton_schema,public;

    Pour plus d'infos : http://www.postgresql.org/docs/8.1/s...L-SCHEMAS-PATH

    Tous les identifiants SANS guillemets sont convertis en minuscules par Postgres (contrairement à la norme SQL qui les traduit en majuscules), ce qui les rend insensibles à la casse. Si tu as créé tes tables en mettant des guillements autour de leurs noms, leur casse est prise en compte et tu es obligé d'employer les guillemets dans les requêtes qui y ont accès.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre averti
    Bonjour

    Je vais completer un peu ce que dis GrandFather au niveau des schémas.

    Pour savoir sur quel schéma par defaut la recherche PostgreSQL utilise on lance la requête suivante :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SHOW search_path;

    On récupère souvent ce type de réponse (Si le fichier de config PG est celui d'origine)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $user,public

    Cette réponse nous indique que l'ordre de recherche des schémas par défaut est :

      $user : Un schéma portant le même nom que l'utlisateur de la connection (ou celui du rôle LOGIN depuis la 8.1);
      public : Le schéma public crée par défaut.


    Donc si on s'est connecté avec l'utilisateur toto , la requête ci dessous
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT * FROM test;

    est réécrite par le moteur en interne en :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT * FROM toto.test;

    Si la table test n'est pas trouvé dans le schéma toto, alors elle est recherché dans le schéma public, donc réécrite :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT * FROM public.test;


    Pour éviter de spécifier le nom du schéma dans la requête il y'a possibilité de lancer la requête suivante :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SET search_path TO 'mon_schema';


    par contre si la table n'existe pas dans le schéma mon_schema, alors celle ci ne sera pas recherché dans le schéma public

    sinon il faut envoyer plutôt cette commande:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SET search_path to 'mon_schema',public;
    Christophe Chauvet
    Consultant Odoo
    Python / PostgreSQL

  5. #5
    Nouveau Candidat au Club
    Merci à vous pour les indications.

    Voila qui va me simplifier la vie.

    Encore une chose :
    Comment peut on recuperer la liste des bases de données sans avoir à s'identifier, si cela existe.

    sinon je creerai un compte factise, ( genre scott pour oracle ).