Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PostgreSQL] Impossibilité de connection à la BDD.

    2 mai 2011 à 4:57:12

    Bijour.
    J'ai créé une ébauche d'un logiciel client pour PostgreSQL, mais dès que je lance le main le try/except me balance en guise d'erreur une phrase coupé avec du md5 qui prétend que ça vient du mot de passe... Bref c'est illisible.

    Je ne sait pas si ça vient du code, du mot de passe (qui pourtant est bon), du port ou de l'IP, ou d'autre facteur...

    Objet-interface et générateur de formulaire

    import sys
    from Globale import*
    from pg8000 import DBAPI
    
    class GestionBD:
        """Mise en place et interfaçage d'une base de données MySQL"""
        def __init__(self, dbName, user, passwd, host, port= 5432):
            "Établissement de la connexion - Création du curseur"
            try:
                self.baseDonn = DBAPI.connect(database= dbName,
                                              user= user, password= passwd,
                                              host= host, port= port)
            except Exception as err:
                print ('La connexion avec la base de données a échoué :\n'\
                      'Erreur détectée :\n%s' % err)
                self.echec =1
            else:    
                self.cursor = self.baseDonn.cursor()   # création du curseur
                self.echec =0
    
        def creerTable(self, dicTables):
            "Création des tables décrites dans le dictionnaire <dicTables>."
            for table in dicTables:            # parcours des clés du dict.
                req = "CREATE TABLE %s (" % table
                pk =''
                for descr in dicTables[table]:
                    nomChamp = descr[0]        # libellé du champ à créer
                    tch = descr[1]             # type de champ à créer
                    if tch =='i':
                        typeChamp ='INTEGER'
                    elif tch =='k':
                        # champ 'clé primaire' (incrémenté automatiquement)
                        typeChamp ='INTEGER AUTO_INCREMENT'   
                        pk = nomChamp
                    else:
                        typeChamp ='VARCHAR(%s)' % tch                
                    req = req + "%s %s, " % (nomChamp, typeChamp)
                if pk == '':
                    req = req[:-2] + ")"
                else:
                    req = req + "CONSTRAINT %s_pk PRIMARY KEY(%s))" % (pk, pk)
                self.executerReq(req)
    
        def supprimerTables(self, dicTables):
            "Suppression de toutes les tables décrites dans <dicTables>"
            for table in dicTables.keys():
                req ="DROP TABLE %s" % table
                self.executerReq(req) 
            self.commit()                       # transfert -> disque
    
        def executerReq(self, req):
            "Exécution de la requête <req>, avec détection d'erreur éventuelle"
            try:
                self.cursor.execute(req)
                
            except Exception as err:
                   # afficher la requête et le message d'erreur système :
                   print ("Requête SQL incorrecte :\n%s\nErreur détectée :\n%s"\
                   % (req, err))
                   return 0
            else:
                 return 1
    
        def resultatReq(self):
            "renvoie le résultat de la requête précédente (un tuple de tuples)"
            return self.cursor.fetchall()
    
        def commit(self):
           if self.baseDonn:
              self.baseDonn.commit()         # transfert curseur -> disque        
    
        def close(self):
            if self.baseDonn:
               self.baseDonn.close()
    
    
    class Enregistreur():
        """classe pour gérer l'entrée d'enregistrement divers"""
        def __init__(self, bd, table):
            self.bd = bd
            self.table = table
            self.descriptif = Glob.dicoT[table]    #descriptif des champs
    
        def entrer(self):
            "procédure d'entrée d'un enregistrement d'entier"
            champs = "("      #ébauche d'une chaine pour les nom de champs
            valeurs = []      #liste pour les valeurs correspondantes
    
            #Demander successivement une valeur pour chaque champ
            for cha, type, nom in self.descriptif:
                if(type == "k"):                #on ne demandera pas le n° d'enregistrement
                   continue                     #à l'utilisateur (numérotation auto)
                
                champs = champs + cha + ","
                val = input("Entrez le champ {}".format(nom))
    
                if(type == "i"):
                   val = int(val)
                   
                valeurs.append(val)
                
            balise = "(" + "%s," * len(valeurs)  #balise de conversion
            champs = champs[:-1] + "("           #supprimer la dernière virgule,
            balise = balise[:-1] + "("           #et ajouté une parentèse
            req    = "INSERT INTO {} {} VALUES {}".format(self.table, champs, balise)
            self.bd.executeReq(req, valeur)
    
            ch = input("Continuer(O/N)? ")
            if(ch.upper() == "O"):
               return 0
            else:
               return 1
    




    Variable "globales"

    class Glob():
          """Espace de noms pour les variables et fonctions <pseudo_globales>"""
          dbName  = "musique"          #Nom de la base de dodnnées
          user    = "ShikiSokuZeku"    #propriétaire ou utilisateur
          passwd  = "Hayabuza"         #mot de passe d'accés
          host    = "127.0.0.1"
          port    = 5432
    
          #Structure de la base de données. Dictionnaire des table & champs:
          dicoT ={"compositeurs":[('id_comp', "k", "clé primaire"),
                                  ('nom', 25, "nom"),
                                  ('prenom', 25, "prénom"),
                                  ('a_naiss', "i", "année de naissance"),
                                  ('a_mort', "i", "année de mort")],
                  "oeuvres":[('id_oeuv', "k", "clé primaire"),
                             ('id_comp', "i", "clé compositeur"),
                             ('titre', 50, "titre de l'oeuvre"),
                             ('duree', "i", "durée (en minutes)"),
                             ('interpr', 30, "interprète principal")]}
    



    Le main

    import sys
    from Globale import*
    from BD      import*
    
    #Création de l'objet-interface avec la base de donnée
    bd = GestionBD(Glob.dbName, Glob.user, Glob.passwd, Glob.host, Glob.port)
    if bd.echec:
       sys.exit()
    
    while 1:
       print("\nQue voulez-vous faire: \n"\
             "1) Créer les tables de la base de données\n"\
             "2) Supprimer les tables de la base de données\n"\
             "3) Entrer des compositeurs\n"\
             "4) Entrer des oeuvres\n"\
             "5) Lister les compositeur\n"\
             "6) Lister les oeuvres\n"\
             "7) Executer une requëte SQL quelconque\n"\
             "8) terminer?   Votre choix: ", end= ' ')
       ch = int(input())
       if(ch == 1):
          #création de toute les tables décrites dans le dico
          bd.creerTable(Glob.dicoT)
          
       elif(ch == 2):
          #suppression de toutes les tables décrites dans le dic
          bd.supprimerTable(Glob.dicoT)
    
       elif(ch == 3 or ch == 4):
          #création d'un enregistreur de compositeur ou d'oeuvre
          table = {3: 'compositeur', 4: 'oeuvres'}[ch]
          enreg = Enregistrement(bd, table)
    
          while 1:
              if(enreg.entrer()):
                 break
    
       elif(ch == 5 or ch == 6):
             #Listage de tout les compositeur || oeuvre
             table = {5: 'compositeur', 6: 'oeuvres'}[ch]
             
             if(bd.executerReq("SELECT * FROM %s" % table)):
                #analyser le résultat de la requête ci-dessus
                records = bd.resultatReq()     #ce serat un tuple de tuple
                
                for rec in record:             #chaque enregistrement
                    for item in req:           #chaque champ dans l'enregistrement
                        print(item, end= ' ')
    
       elif(ch == 7):
             req == input("Entrez la requête SQL: ")
             if(bd.executerReq(req)):
                print(bd.resultatReq())        #ce serat un tuple de tuple
    
       else:
             bd.comit()
             bd.close()
             break
    



    Merci de votre aide future.
    • Partager sur Facebook
    • Partager sur Twitter
      2 mai 2011 à 18:36:55

      Citation : Kamiyuzuki

      me balance en guise d'erreur une phrase coupé avec du md5 qui prétend que ça vient du mot de passe... Bref c'est illisible.



      Et donc quel est ce message d'erreur ? (mets le stacktrace en entier)
      • Partager sur Facebook
      • Partager sur Twitter
        3 mai 2011 à 3:42:46

        La connexion avec la base de données a échoué :
        Erreur détectée :
        (b'FATAL', b'28P01', b"authentification par mot de passe \xe9chou\xe9e pour l'utilisateur  \xab ShikiSokuZeku \xbb")
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          3 mai 2011 à 7:10:51

          Citation

          J'ai créé une ébauche d'un logiciel client pour PostgreSQL, mais dès que je lance le main le try/except me balance en guise d'erreur une phrase coupé avec du md5 qui prétend que ça vient du mot de passe... Bref c'est illisible.



          Euh c'est pas du md5 o_O

          et ton dbname, c'est normal qu'il n'est pas d'extension?
          • Partager sur Facebook
          • Partager sur Twitter
            3 mai 2011 à 9:38:54

            Il te dit que l'authentification par mot de passe a échoué (en utf8) ... il faut lire les messages d'erreur !

            causes possibles :

            - authentification par mot de passe désactivée dans pg_hba.conf
            - mauvais login ou mot de passe
            • Partager sur Facebook
            • Partager sur Twitter
              4 mai 2011 à 0:34:28

              l'extension ne change rien, et le mdp est le bon...
              c'est quoi pg_hba.conf ?

              Merci de vos réponses.
              • Partager sur Facebook
              • Partager sur Twitter
                4 mai 2011 à 0:52:11

                pg_hba.conf permet de configurer les moyens pour accéder au serveur.
                Et par défaut il me semble que postgreSQL écoute seulement dans un fichier (local domain socket), et c'est tout (après je peux me tromper), donc c'est peut-être pour ça que ça ne fonctionne pas.
                Donc tu dois modifier ton pg_hba.conf en conséquence pour indiquer à postgresql :
                - qu'il doit ouvrir un port sur localhost, si ça n'est pas déjà fait
                - qu'il doit autoriser l'authentification par mot de passe des clients qui viennent de localhost.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  4 mai 2011 à 8:43:32

                  Bah écoute, tu sais le net est une énorme source d'information, tu cherches un peu, hein?

                  pg_hba.conf

                  En français ici
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 mai 2011 à 10:30:38

                    Faut décommenter cette ligne :

                    # IPv4 local connections:
                    host    all         all         127.0.0.1/32          md5
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 mai 2011 à 1:26:30

                      Voici mon fichier pg_hba:
                      # socket, "host" is either a plain or SSL-encrypted TCP/IP socket,
                      # "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a
                      # plain TCP/IP socket.
                      #
                      # DATABASE can be "all", "sameuser", "samerole", "replication", a
                      # database name, or a comma-separated list thereof.
                      #
                      # USER can be "all", a user name, a group name prefixed with "+", or a
                      # comma-separated list thereof.  In both the DATABASE and USER fields
                      # you can also write a file name prefixed with "@" to include names
                      # from a separate file.
                      #
                      # CIDR-ADDRESS specifies the set of hosts the record matches.  It is
                      # made up of an IP address and a CIDR mask that is an integer (between
                      # 0 and 32 (IPv4) or 128 (IPv6) inclusive) that specifies the number
                      # of significant bits in the mask.  Alternatively, you can write an IP
                      # address and netmask in separate columns to specify the set of hosts.
                      # Instead of a CIDR-address, you can write "samehost" to match any of
                      # the server's own IP addresses, or "samenet" to match any address in
                      # any subnet that the server is directly connected to.
                      #
                      # METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
                      # "krb5", "ident", "pam", "ldap", "radius" or "cert".  Note that
                      # "password" sends passwords in clear text; "md5" is preferred since
                      # it sends encrypted passwords.
                      #
                      # OPTIONS are a set of options for the authentication in the format
                      # NAME=VALUE.  The available options depend on the different
                      # authentication methods -- refer to the "Client Authentication"
                      # section in the documentation for a list of which options are
                      # available for which authentication methods.
                      #
                      # Database and user names containing spaces, commas, quotes and other
                      # special characters must be quoted.  Quoting one of the keywords
                      # "all", "sameuser", "samerole" or "replication" makes the name lose
                      # its special character, and just match a database or username with
                      # that name.
                      #
                      # This file is read on server startup and when the postmaster receives
                      # a SIGHUP signal.  If you edit the file on a running system, you have
                      # to SIGHUP the postmaster for the changes to take effect.  You can
                      # use "pg_ctl reload" to do that.
                      
                      # Put your actual configuration here
                      # ----------------------------------
                      #
                      # If you want to allow non-local connections, you need to add more
                      # "host" records.  In that case you will also need to make PostgreSQL
                      # listen on a non-local interface via the listen_addresses
                      # configuration parameter, or via the -i or -h command line switches.
                      
                      
                      
                      # TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
                      host    all             all             127.0.0.1/32            trust
                      #IPv6 local connections:
                      host    all             all             ::1/128                 md5


                      Mais voici maintenant l'erreur:
                      (b'FATAL', b'28000', b"le r\xf4le \xab ShikiSokuZeku \xbb n'existe pas")


                      Pourtant c'est bel et bien mon nom d'utilisateur...
                      (merci fred pour le tuyau)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 mai 2011 à 10:01:20

                        Tu as pensé à créer l'utilisateur ShikiSokuZeku dans postgres ?..
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 mai 2011 à 22:37:51

                          Oui, mais y a t'il un moyen pour vérifier?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 mai 2011 à 23:17:13

                            Tente un select * from pg_user;
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 mai 2011 à 2:17:38

                              Merci mais ça me donne un invalid syntax...
                              Mais normalement c'est mon nom d'utilisateur.
                              Bizard cette histoire...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 mai 2011 à 11:19:56

                                Tu as des utilisateurs sur le système, mais postgreSQL a ses propres utilisateurs, donc si tu ne t'est pas créé un utilisateur « ShikiSokuZeku » DANS postgreSQL, c'est normal que ça ne fonctionne pas.
                                Je te conseille de chercher un tuto sur l'installation/configuration de postgreSQL ;)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                [PostgreSQL] Impossibilité de connection à la BDD.

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown