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

Python Discussion :

Connecter Python avec PostgreSQL


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 88
    Points : 58
    Points
    58
    Par défaut Connecter Python avec PostgreSQL
    Bonjour tout le monde , je viens de créer ma base de données sur PgAdmin , et je veux l'acceder depuis un code python , comment faire ? j'ai deja le module "Psycopg2" .. merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    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
    import psycopg2
    # on crée la  connection 
    connect=psycopg2.connect("dbname='ta_base' user='nom_user' host=adresse_ip password='mot _passe'")
    # on crée un curseur
    cur = connect.cursor()
    #execution requete
    cur.execute("select * from ma_table")
    # on recupère le resultat avec fetchone() ou fetchall()
    #exemple onécrit les enregistrements
    for  enr in cur.fetcall():
        print enr
    # si tu fais un insert ou update il faut mettre l'instruction commit pour valider
    cur.execute("update ma_table set...")
    cur.commit()
    # pour fermer connection
    connect.close()

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 88
    Points : 58
    Points
    58
    Par défaut Affichage dans un Treeview
    Bonjour xavier-Pierre , merci pour ta réponse , j'ai enfin pu connecté l'interface Tkinter avec ma base PostgreSQL , j'ai mis ce code :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    #! /usr/bin/python
    #-*- coding:Utf-8-*-
     
    from Tkinter import *
    import ttk
    import psycopg2
     
    def center(window):
     
        sw = window.winfo_screenwidth()
        sh = window.winfo_screenheight()
        rw = window.winfo_reqwidth()
        rh = window.winfo_reqheight()
        xc = (sw - rw) / 2
        yc = (sh -rh) / 2
        window.geometry("+%d+%d" % (xc, yc))
        window.deiconify() 
     
    def afficher() : 
        connect()
        cur = conn.cursor()
        cur.execute("""SELECT * from firstbasetable""")
     
        rows = cur.fetchall()
     
        if rows :
            for z in rows:
                print z[1] + ' : ' + str(z[2])
                tv.insert("","end", values=(z[1], z[2], z[3]))
     
    def connect() :
        global conn
        conn = psycopg2.connect("host='localhost' dbname='firstbase' user='postgres' password='pesbakpostgresql'")
     
    fenetre=Tk()
    fenetre.geometry("500x400")
    fenetre.title('             Test Data')  
     
    firstnamevar = StringVar()
    lastnamevar = StringVar()
    Phonevar = IntVar()
     
    f1 = Frame(fenetre, bg="#290080",  width=500, height=500)
    f1.pack( fill=X, expand=0)
     
    lab1 = Label(fenetre, text="Voila la table testtable de la base testbase" , bg = "#290080", fg = "white" )
    lab1.place ( x=100 , y=15 )
     
    lab1 = Label(fenetre, text="Prénom" , bg = "#290080", fg = "white" )
    lab1.place ( x=30 , y=100 )
    lab1 = Label(fenetre, text="Nom" , bg = "#290080", fg = "white" )
    lab1.place ( x=30 , y=125)
    lab1 = Label(fenetre, text="Phone" , bg = "#290080", fg = "white" )
    lab1.place ( x=30 , y=150)
     
    firstname_entry = ttk.Entry(fenetre, width=15, textvariable=firstnamevar)
    firstname_entry.place (x = 100 , y = 100 )
    lastname_entry = ttk.Entry(fenetre, width=15, textvariable=lastnamevar)
    lastname_entry.place (x = 100 , y = 125 )
    Phone_entry = ttk.Entry(fenetre, width=15, textvariable=Phonevar)
    Phone_entry.place (x = 100 , y = 150 )
    Phonevar.set("")
     
    scrollbar = Scrollbar(fenetre)
    scrollbar.place (x = 412 , y = 301 )
    tv = ttk.Treeview(fenetre, show='headings',  height =3, yscrollcommand=scrollbar.set)
    tv["columns"]=("col1","col2","col3")
    tv.column("col1",width=100,anchor="center", stretch = True, minwidth = 50)
    tv.column("col2",width=100,anchor="center")
    tv.column("col3",width=110,anchor="center")
    tv.heading("col1",text="Prénom")
    tv.heading("col2",text="Nom")
    tv.heading("col3",text="Phone number")
    tv.place( x = 100 , y = 250 )
    scrollbar.config(command=tv.yview)
     
     
     
    afficher = Button(fenetre, text = "Afficher" , command = afficher)
    afficher.place( x=315, y=80 )
    inserer = Button(fenetre, text = "Inserer" , command = insere)
    inserer.place( x=315, y=110 )
    modifier = Button(fenetre, text = "Modifier" ) #, command = modif)
    modifier.place( x=315, y=140 )
    supprimer = Button(fenetre, text = "Supprimer" , command = afficheselected)
    supprimer.place( x=315, y=170 )
    Quitter = Button(fenetre, text = "Quitter" , command = fenetre.quit)
    Quitter.place( x=200, y=350 )
     
     
     
    fenetre.after(0,center,fenetre)
    fenetre.mainloop()
    ça marche bien , sauf que dans la fonction afficher() , quand j'insere les données dans la Treeview j'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)
    Et si j'affiche les données sur un terminale c'est bien : car j'ai dans la bas Prénom1 , Prénom2 dans un champ "Prenom" de la table "firstbasetable " , je pense que le probleme vient du manque des deux commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charset = "utf8" , use_unicode=True
    qui doivent etre dans la définition de la connexion comme dans mysql , mais je sais pas comment les placer avec psycopg2 , sur MySQL c'est comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db = MySQLdb.connect(host = "localhost", user = "root", passwd = "firstmysql",db = "testbase",charset = "utf8" , use_unicode=True)
    J'arrive pas à en sortir encore ...

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    essaie avant de faire l'insert de rajouter l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    cur.execute("set client_encoding to 'le_codage';
    SELECT * from firstbasetable")
    il faut remplacer le_codage par le codage ultiliser dans ton appli python

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 88
    Points : 58
    Points
    58
    Par défaut Affichage dans un Treeview
    Mercii xavier-Pierre pour ta réponse , je vais essayer tout de suite et reviens te dire le resultat

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 88
    Points : 58
    Points
    58
    Par défaut
    j'ai essayé le code mais ça affiche toujours le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)
    j'ai remplacé 'le_code' par ' UTF8' , 'Utf-8' , 'UTF-8' , ... , mais ça ne marche pas

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 675
    Points : 30 963
    Points
    30 963
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ismatus1 Voir le message
    j'ai essayé le code mais ça affiche toujours le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2: ordinal not in range(128)
    j'ai remplacé 'le_code' par ' UTF8' , 'Utf-8' , 'UTF-8' , ... , mais ça ne marche pas
    Salut
    Remplace
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    print z[1] + ' : ' + str(z[2])
    par
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    print "%s : %s" % (z[1], z[2])

    Et si ça ne marche toujours pas, alors
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print "%s : %s" % (
        z[1].decode('utf-8').encode('latin-1'),
        z[2].decode('utf-8').encode('latin-1'),
    )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 88
    Points : 58
    Points
    58
    Par défaut Affichage dans un Treeview
    Bonjour , merci Svear pour la reponse , j'ai essayé tout ce que tu m'as proposé , en fait le probleme n'est pas pour le "print" , car ça affiche bien "Prénom1" sur un terminal , et aussi sur un Label comme texte , le probleme vient surtout quand je veux inserer mes données dans le Treeview de Tkinter , alors dans l'Erreur au terminale on dit que l'erreur commence à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tv.insert("","end", values=(z[1], z[2], z[3]))
    Merci bien

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 675
    Points : 30 963
    Points
    30 963
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ismatus1 Voir le message
    Bonjour , merci Svear pour la reponse , j'ai essayé tout ce que tu m'as proposé , en fait le probleme n'est pas pour le "print" , car ça affiche bien "Prénom1" sur un terminal , et aussi sur un Label comme texte , le probleme vient surtout quand je veux inserer mes données dans le Treeview de Tkinter , alors dans l'Erreur au terminale on dit que l'erreur commence à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tv.insert("","end", values=(z[1], z[2], z[3]))
    Merci bien
    Je ne connais pas tk, moi j'utilise Qt.
    Cependant ça peut arriver que je me trompe dans Qt. Par exemple une de mes erreurs les plus courantes, dans un QTreeWidget justement, est de passer un QString (chaine Qt) au QTreeWidgetItem alors que celui-ci attend un QStringList (tableau de chaines).
    Donc
    1) vérifie le type précis attendu dans "values="
    2) vérifie en affichant type(z[x]) que chaque élément x est du bon type

    Accessoirement, ton code peut se réécrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tv.insert("","end", values=z[1:4])
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 88
    Points : 58
    Points
    58
    Par défaut Tkinter avec PostgreSQL
    Bonjour svear , merci pour la réponse , mais , je ne sais pas comment traduire ce que tu m'avais dis pour Tkinter ... J'ai posté mon code , si tu peux le modifier et l'enregistrer ça sera bien ...

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 675
    Points : 30 963
    Points
    30 963
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ismatus1 Voir le message
    Bonjour svear , merci pour la réponse , mais , je ne sais pas comment traduire ce que tu m'avais dis pour Tkinter
    Je t'ai dit de vérifier (dans la documentation) quel type précis était attendu dans le paramètre "values=" d'un Treeview... puis de vérifier si chaque v[x] que toi tu lui passes était du type correspondant. C'est un travail perso que toi seul peut faire. Suffit de 1) lire la doc et 2) afficher type(v[x])

    Citation Envoyé par Ismatus1 Voir le message
    ... J'ai posté mon code , si tu peux le modifier et l'enregistrer ça sera bien ...
    Tu l'as posté où ? Rien dans mes MP ni dans ma boite mail. De toute façon on n'est pas là pour réécrire ton code non plus...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2011
    Messages : 88
    Points : 58
    Points
    58
    Par défaut
    Bonjour Svear , en fait le probleme était du à un decodage qui doit se faire avec une commande comme ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tv.insert("","end", values=("%s %s %s"%(z[1].decode('utf-8'), z[2].decode('utf-8'), z[3].decode('utf-8'))))
    et ça fonctionnait enfin , merci bien ami

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/04/2010, 18h04
  2. Connecter Hibernate avec PostgreSql
    Par NGeVtC87 dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/01/2010, 22h05
  3. connection python avec la base de donne postgresql
    Par bouchranaoufal dans le forum Général Python
    Réponses: 1
    Dernier message: 06/10/2009, 14h34
  4. Se Connecter Python avec Oracle
    Par Dayssam dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 09/05/2008, 22h31
  5. Probleme avec Postgresql de connection a distance
    Par ToMs dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 14/04/2006, 10h37

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