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:
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 Table:
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 = {}
classe RequeteSQL:
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
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.

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