Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

psycopg2 et wxpython

1 réponse
Avatar
Laurent FRANCOIS
Bonjour

1/ J'arrive a créer un dictionnaire a partir du programme
pyvalidator.py sous la forme d'une variable data

2/ J'arrive a remplir des enregistrements dans une table postgresql avec
le programme connection.py

Maintenant j'aimerai apprendre a faire la jonction entre les deux.

Est-ce que quelqu'un a du temps pour m'expliquer cela?

Merci



----- pyvalidator.py ------
import wx
import pprint

about_txt = """\
The validator used in this example shows how the validator
can be used to transfer data to and from each text control
automatically when the dialog is shown and dismissed."""


class DataXferValidator(wx.PyValidator):
def __init__(self, data, key):
wx.PyValidator.__init__(self)
self.data = data
self.key = key

def Clone(self):
"""
Note that every validator must implement the Clone() method.
"""
return DataXferValidator(self.data, self.key)

def Validate(self, win):
return True

def TransferToWindow(self):
textCtrl = self.GetWindow()
textCtrl.SetValue(self.data.get(self.key, ""))
return True

def TransferFromWindow(self):
textCtrl = self.GetWindow()
self.data[self.key] = textCtrl.GetValue()
return True



class MyDialog(wx.Dialog):
def __init__(self, data):
wx.Dialog.__init__(self, None, -1, "Validators: data transfer")

# Create the text controls
about = wx.StaticText(self, -1, about_txt)
name_l = wx.StaticText(self, -1, "Name:")
email_l = wx.StaticText(self, -1, "Email:")
phone_l = wx.StaticText(self, -1, "Phone:")

name_t = wx.TextCtrl(self, validator=DataXferValidator(data,
"name"))
email_t = wx.TextCtrl(self, validator=DataXferValidator(data,
"email"))
phone_t = wx.TextCtrl(self, validator=DataXferValidator(data,
"phone"))

# Use standard button IDs
okay = wx.Button(self, wx.ID_OK)
okay.SetDefault()
cancel = wx.Button(self, wx.ID_CANCEL)

# Layout with sizers
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(about, 0, wx.ALL, 5)
sizer.Add(wx.StaticLine(self), 0, wx.EXPAND|wx.ALL, 5)

fgs = wx.FlexGridSizer(3, 2, 5, 5)
fgs.Add(name_l, 0, wx.ALIGN_RIGHT)
fgs.Add(name_t, 0, wx.EXPAND)
fgs.Add(email_l, 0, wx.ALIGN_RIGHT)
fgs.Add(email_t, 0, wx.EXPAND)
fgs.Add(phone_l, 0, wx.ALIGN_RIGHT)
fgs.Add(phone_t, 0, wx.EXPAND)
fgs.AddGrowableCol(1)
sizer.Add(fgs, 0, wx.EXPAND|wx.ALL, 5)

btns = wx.StdDialogButtonSizer()
btns.AddButton(okay)
btns.AddButton(cancel)
btns.Realize()
sizer.Add(btns, 0, wx.EXPAND|wx.ALL, 5)

self.SetSizer(sizer)
sizer.Fit(self)


app = wx.PySimpleApp()

data = { "name" : "Jordyn Dunn","email":"toto@tot.com"}
dlg = MyDialog(data)
dlg.ShowModal()
dlg.Destroy()

wx.MessageBox("You entered these values:\n\n" +
pprint.pformat(data))
print data
app.MainLoop()
### -------------

## --- connection.py
#!/usr/bin/env python
# -*- coding: UTF8 -*-

## ====================================================================
## dired: /home/lfs/workcopy/ophtagnu/trunk/test/
## filename: connection.py
## Crée par: lfs
## Il s'agit d'un premier fichier de connection avec psycopg2

## L'utilisateur 'tester' est un user LINUX. Un role tester doit être crée
## #====================================================================




import psycopg2 as pg2
import sys
import psycopg2.extras

## Addition du chemin vers le module psycopg2/extras.py
sys.path.append("/usr/lib/python2.4/site-packages/psycopg2/extras.py")
print "le chemin d'accés au module est", sys.path

##===================================================================

try:
conn = pg2.connect("dbname='mydbtester' user='tester'\
host='localhost' password='tester'")

except:
print "Je n\'arrive pas à me connecter"


#curs = conn.cursor()
curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
## creation de la table
TABLE='testertable'

NAMEDICT = ({"name":"Joshua", "email":"joshua@toto.com",
"phone":"26262626"},\
{"name":"Steven", "email":"steven@toto.com", "phone":"5454545"},\
{"name":"David", "email":"david@toto.com", "phone":"78787878787"})

##------ Destruction de la table testertable ------
try:
curs.execute('DROP TABLE testertable')
except:
print "la table testertable n'existe pas"

##------ Création de la table testertable -----
curs.execute('CREATE TABLE testertable(name char(20), email char(20),
phone char(20))')

##------ Peuplement de la table

print type(NAMEDICT)

curs.executemany("""INSERT INTO testertable(name, email, phone) VALUES
(%(name)s, %(email)s, %(phone)s)""", NAMEDICT)

## ##------ Seletion des données de la table
## SQL="SELECT * FROM testertable"
## curs.execute(SQL)
## rows = curs.fetchall()
## print "le resultat de:", SQL , "est:"
## for line in rows:
## print line
##------ description du curseur
print "curs.description:", curs.description
print "curs.fileno() Return file descriptor associated to database
connection:",curs.fileno()
## Le commit se fait sur la connection pas sur le curseur
conn.commit()
curs.close()

1 réponse

Avatar
Bruno Desthuilliers
Bonjour

1/ J'arrive a créer un dictionnaire a partir du programme pyvalidator.py
sous la forme d'une variable data

2/ J'arrive a remplir des enregistrements dans une table postgresql avec
le programme connection.py


Maintenant j'aimerai apprendre a faire la jonction entre les deux.

Est-ce que quelqu'un a du temps pour m'expliquer cela?



Commence par transformer connection.py en un module digne de ce nom -en
mettant le code dans des fonctions, pas au top-level, et en passant tes
données de test aux fonctions.

Après, la solution devrait t'apparaître assez évidente. Sinon, reviens
ici !-)


Astuce:

quand un fichier .py est chargé dans l'interpréteur (machine virtuelle)
Python, la variable 'globale' (au module - il n'y a pas de vraies
globales en Python) '__name__' est positionnée avec soit le nom du
module (quand le .py est importé depuis un script ou un autre module),
soit avec '__main__' quand le fichier .py est utilisé comme script (ie:
directement passé à l'interpréteur).

Donc, l'idiome canonique pour avoir un bout de code qui n'est exécuté
*que* si le fichier .py est utilisé comme script est:

## fichier.py --
# imports ici
# definitions (fonctions, classes, etc) ici

if __name__ == '__main__':
# on est appelé comme script
# code ici

## fichier.py --


C'est utile soit pour définir un fichier utilisable à la fois comme
script et comme module, soit pour mettre des tests dans un module (même
si ça ne vaut pas un framework de test unitaire).



(snip partie wxPython)

<hs>
Généralement, on évite de poster tout un programme...
</hs>

<hs id='2'>
Attention, à partir de là je tape sur tout ce qui bouge !-)
</hs>


## --- connection.py
#!/usr/bin/env python
# -*- coding: UTF8 -*-


import psycopg2 as pg2
import sys
import psycopg2.extras


<hs>
Pour des tests - ou pour poster sur usenet -, je te recommande SQLite.
Ton problème n'est pas spécifique à Postgres, et tout le monde n'a pas
postgres sur sa machine....
</hs>

## Addition du chemin vers le module psycopg2/extras.py
sys.path.append("/usr/lib/python2.4/site-packages/psycopg2/extras.py")
print "le chemin d'accés au module est", sys.path


Pas portable... mais tu t'en doutes, je suppose.

Et surtout tout à fait inutile (et possiblement trompeur), puisque:
1/ sys.path est une liste de chemins de *répertoires*
2/ si tu a pu importer psycopg2.extras, c'est qu'il est déjà dans ton path
3/ dans ce cas, son chemin est connu (c'est l'attribut __file__ du module)



##================================================================== >
try:
conn = pg2.connect("dbname='mydbtester' user='tester'
host='localhost' password='tester'")

except:
print "Je n'arrive pas à me connecter"


1/ N'utilise *jamais* de clause except sans préciser explicitement
quelle(s) type(s) d'exception tu attends.

2/ Pour demain sur un cahier propre, tu m'explique pourquoi il aurait
été préférable ici de ne pas mettre de gestionnaire d'erreur *du tout*.

(hint: en cas d'exception lors de la connection, que se passe-t-il avec
ton gestionnaire tel qu'il est, et que se passerait-il sans gestion
d'erreur ?)


#curs = conn.cursor()
curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
## creation de la table
TABLE='testertable'

NAMEDICT = ({"name":"Joshua", "email":"",
"phone":"26262626"},
{"name":"Steven", "email":"", "phone":"5454545"},
{"name":"David", "email":"", "phone":"78787878787"})

##------ Destruction de la table testertable ------
try:
curs.execute('DROP TABLE testertable')
except:
print "la table testertable n'existe pas"


cf plus haut

##------ Création de la table testertable -----
curs.execute('CREATE TABLE testertable(name char(20), email char(20),
phone char(20))')


<hs sujet='sql'>
Toujours définir un identifiant unique.
</hs>

## ##------ Seletion des données de la table
## SQL="SELECT * FROM testertable"
## curs.execute(SQL)
## rows = curs.fetchall()
## print "le resultat de:", SQL , "est:"
## for line in rows:
## print line


plus simple:

curs.execute(SQL)
for row in cursor:
print row