Bonjour,
je développe une application PyQt4 qui doit commencer par récupérer tout le contenu et la structure de la base de données de mon site internet.
Pour cela, j'ai créé un fichier php dédié que j'ai mis sur mon serveur, et j'appelle cette page depuis mon appli python grâce à urllib2.urlopen et urllib2.Request.
Je récupère ensuite le texte html créé afin d'en extraire les résultats de ma requête. Au démarrage de mon application, je lance donc une série de requêtes afin d'obtenir le nom des tables de la base, et pour chaque table le nom des champs qui la composent et toutes les données.
Voici mon code:
Extrait de la méthode __init__ de mon application:
classe Table:
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 # Recuperation de la liste des tables (noms) requeteListeTables= RequeteSQL.RequeteSQL(self.parametres.url, 'lireStructure') self.nomsTables= requeteListeTables.executer() #Creation de self.tables, tableau d'objets Table self.tables = [] for nomTable in self.nomsTables: # Creation d'une nouvelle Table newTable = Table.Table(nomTable) # Recuperation de la liste des champs de la table requeteChampsTable = RequeteSQL.RequeteSQL(self.parametres.url, 'lireStructure', nomTable) listeChamps = requeteChampsTable.executer() # Recuperation des donnees pour chaque champ de la table for nomChamp in listeChamps: requeteDonneesChamp = RequeteSQL.RequeteSQL(self.parametres.url, 'lireDonnees', nomTable, nomChamp) listeDonnees = requeteDonneesChamp.executer() newTable.champs[nomChamp] = listeDonnees self.tables.append(newTable)
classe RequeteSQL:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class Table(): ''' Table: represente une table de la base de donnees ''' def __init__(self, nomTable): ''' Constructeur de la classe Table nomTable: (str) nom de la table correspondante dans la base de donnees ''' self.nom = nomTable self.champs = {}
Mon problème est que cela prends pas mal de temps, environ 10s par table pour tout récupérer... Je ne suis pas sure de pouvoir réduire ce temps, mais je voudrais au moins afficher une fenêtre avec l'état d'avancement afin que l'utilisateur sache où en est l'application.
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 class RequeteSQL(): ''' RequeteSQL: generation et execution de requetes SQL sur la base de donnees ''' def __init__(self, url, action, table=None, champ=None, id=None): ''' Constructeur de la classe RequeteSQL url: adresse du fichier "gestionBDD.php" du site action: (str) type de requete a effectuer table: (objet Table - factultatif) table concernee champ: (str - factultatif) champ de la table concerne id: (int - facultatif) identifiant de l entree de la table concerne ''' self.url = url self.action = action self.table = table self.champ = champ self.id = id self.resultat = [] self.requete = '' self.generer() def generer(self): ''' Generere le texte correspondant a la requete demandee ''' if self.action == 'lireStructure': if self.table is None: self.requete = "lire.all" else: self.requete = 'lire.' + self.table elif self.action == 'lireDonnees': self.requete = 'lire.%s.%s'%(self.table, self.champ) if self.id is not None: self.requete = self.requete + '.' + self.id def executer(self): ''' Appel a la page php definie par self.url avec la requete a effectuer Recuperation des resultats dans le texte html ainsi genere ''' # Execution de la requete: genere une page HTML avec les resultats (dans string "resultRequete") try: resultRequete = urllib2.urlopen(urllib2.Request(self.url + '?requete=' + self.requete, None, {'User-Agent': 'MyBrowser/0.1'})).read() except urllib2.HTTPError: return "la page specifiee: %s est introuvable"%(self.url,) # Extraction des resultats m = re.split('<separator>', resultRequete) if len(m) == 0: return "La requete n'a pu etre executee" else: m.pop(0) if len(m) > 0: m.pop() if len(m) == 0: return "La requete a renvoye une chaine vide" elif len(m)==1 and m[0].startswith('ERREUR'): return m[0] else: self.resultat = m return self.resultat
J'ai vu qu'on pouvait utiliser des QThread pour gérer l'affichage d'une fenêtre Qt tout en effectuant d'autres tâches, mais je ne comprends pas trop comment cela fonctionne
Peut-être y a t-il aussi moyen de réduire le temps d'execution? Je vous remercie d'avance pour toute aide ou idée que vous pourriez m'apporter![]()
Partager