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 :

Lecture BDD SQL en multithreading [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai Avatar de le_pie_thon
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Par défaut Lecture BDD SQL en multithreading
    Bonjour à toutes et à tous,

    Je viens vers vous car j'ai besoin d'aide sur mon code en python. Etant un néophyte, j'ai énormément de mal à comprendre le multithreading, et comment je pourrais l'implémenter dans mon programme.

    Premièrement, ce que je souhaiterais réaliser, est une boucle lisant chaque colonne d'une base de donnée SQLlite3 (je penses avoir réussi cette partie ^^).

    Cependant (et c'est la ou je bloque), à l’intérieur de cette boucle, je souhaiterais exécuter un script indépendant, en parallèle, lisant chacune de ces colonnes.Ce script devra être appelé à chaque ligne du tableau SQL

    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
     
    class Lecture_BDD_SQL ():
        def __init__ (self):
            pass
     
        def lecture_db(self,): 
        #   Lis les bases de donnees et execute la requete 
            try:                
                os.chdir('P:\\Test_Python\\Operationnel\\RequeteSQL\\BDD')
                #creation curseur
                connect_table_test = sqlite3.connect('Test.db')
                curseur_test = connect_table_test.cursor()
                #voit tous les ligne presente dans la bdd
                #curseur_requete.execute("SELECT Id,Ref,Utilisateur,Environment,Requete,Frequence FROM Table_requete")
                curseur_test.execute("SELECT * FROM Test")
                #recuperation des informations de chaque colone par ligne
                maliste = curseur_test.fetchall()
                for ligne in maliste :  
                    self.ma_liste_test(ligne)#----------------------------------------------> Process qui doit etre en parallele independant
                curseur_test.close()
                connect_table_test.close()
            except AttributeError as Ae :
                print("Erreur d'attribut: \n {}".format(Ae))
            except EnvironmentError as EnE :
                print(EnE)
            except SyntaxError as SyE :
                print("Une erreur dans la syntaxe est survenue : \n {}".format(SyE))        
            except ImportError as ImE:
                print("Le module implementer est introuvable : \n {}".format(ImE))
     
        def ma_liste_test(self,*maliste):
            '''
                Lecture de la liste et execution de la requete vers la base de donnée concernée
            '''
            une_liste = maliste
            for colonne in une_liste:
                id_req = colonne[0]
                ref = colonne[1]
                username = colonne[2]
                env_req = colonne[3]
                query_req = colonne[4]
                frequenece_req = colonne[5]
                url_req = colonne[6]
                port_req = colonne[7]
                host_req = colonne[8]
                nombase_req = colonne[9]             
     
               #creation d'un dsn makedsn('Host Name', 'Port Number', nom_base ='Service Name')
               dsn_oracle = cx_Oracle.makedsn(host_req,port_req,service_name = nombase_req  )
               #connexion à la BDD 
               db = cx_Oracle.connect(user = username, dsn = dsn_oracle )
               curseur = db.cursor()
     
               #execution de la requete
               try:
                     data_oracle = curseur.execute(query_req)                                
                    except cx_Oracle.DatabaseError as exc:
                    error, = exc.args
                    print("Oracle-Error-Code:", error.code)
                    print("Oracle-Error-Message:", error.message)
                    #recuperation des resultats de la requete
                    resultats = data_oracle.fetchall()
                    print(resultats)
                    curseur.close()
                    time.sleep(frequenece_req)
                    #enregistrement du resultat dans la BDD 
                    os.chdir('P:\\Test_Python\\Operationnel\\RequeteSQL\\BDD')
                    #creation ichier sauvegarde
                    fichier = open("SaveRequest.txt","a")
                    fichier.write("====================================================\n" ) 
                    heure =  datetime.now()
                    fichier.write("heure actuelle: \n{heureactuelle} \n".format(heureactuelle = heure))
                    fichier.write("La requete appelée:\n{requete} \n".format(requete = query_req) )
                    fichier.write("Resultats de la requête : \n{result}\n".format(result = resultats))
    J'ai aussi entendu parler du multiprocessing et du ThreadPoolExecutor mais je ne vois pas lequel utiliser ^^

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par le_pie_thon Voir le message
    J'ai aussi entendu parler du multiprocessing et du ThreadPoolExecutor mais je ne vois pas lequel utiliser ^^
    Dans ce cas, peut être que vous pourriez jeter un œil à la bibliothèque concurrent.futures qui permet de passer de l'un à l'autre (process vs. threads) sans trop de soucis.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Attention tout de même: sqlite3 n'est pas un serveur, et donc ne devrait pas supporter les accès multiples. Peut-être que ça marche quand même en lecture? Je n'ai jamais essayé.

    Pour des accès multi-thread, il faudrait peut-être utiliser un verrou, que chaque thread ne déverrouillera que lorsque que le traitement de la requête lancée par ce thread sera effectivement terminée.

  4. #4
    Membre à l'essai Avatar de le_pie_thon
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Attention tout de même: sqlite3 n'est pas un serveur, et donc ne devrait pas supporter les accès multiples. Peut-être que ça marche quand même en lecture? Je n'ai jamais essayé.

    Pour des accès multi-thread, il faudrait peut-être utiliser un verrou, que chaque thread ne déverrouillera que lorsque que le traitement de la requête lancée par ce thread sera effectivement terminée.
    Merci de ta réponse,
    La lecture de la bas de donnée comme je l'ai écrite fonctionne correctement, il arrive à lire et affecter a chaque variable, la colonne qui lui est dédiée,

    Cependant je ne comprends pas comment je pourrais mettre en place ce verrou dans mon cas ^^

    Je me suis informé grâce à ce site pour ceux qui souhaitent en apprendre d'avantage :

    http://python.jpvweb.com/python/mesr...id=thread_lock

    Encore une fois merci pour tout

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Attention tout de même: sqlite3 n'est pas un serveur, et donc ne devrait pas supporter les accès multiples. Peut-être que ça marche quand même en lecture? Je n'ai jamais essayé.
    Les accès à sqlite3 sont en lecture et les différents enregistrements sont utilisés pour accéder à une base Oracle (via ma_liste_test). Si c'est les appels à cette fonction qu'on veut paralléliser, la base de donnée supporte (et pas besoin de verrou).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai Avatar de le_pie_thon
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Les accès à sqlite3 sont en lecture et les différents enregistrements sont utilisés pour accéder à une base Oracle (via ma_liste_test). Si c'est les appels à cette fonction qu'on veut paralléliser, la base de donnée supporte (et pas besoin de verrou).

    - W
    Merci pour votre réponse,

    En effet ce que je souhaiterais c'est exécuter ma_liste_test(), en parallèle de la fonction bouclant sur la lecture de chacune des lignes de la table SQL.
    Cela veut dire qu'a chaque ligne de la table Test.sql, le programme une nouvelle fonction ma_liste_test() (cf.schema) Nom : Schema.PNG
Affichages : 524
Taille : 35,6 Ko

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par le_pie_thon Voir le message
    En effet ce que je souhaiterais c'est exécuter ma_liste_test(), en parallèle de la fonction bouclant sur la lecture de chacune des lignes de la table SQL.
    Je vous ai déjà suggéré de regarder concurrent.futures.
    La documentation contient suffisamment d'exemples qui peuvent vous servir de point de départ.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [sql Flash] Lecture BDD dans Flash , INSERT ou UPDATE
    Par Keroik dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/08/2007, 11h20
  2. Generer un script pour une BDD "*.sql"+"*.bat
    Par subzero82 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/08/2005, 16h47
  3. Erreur de connexion à une BDD SQL Server 2000 avec BDE
    Par SchpatziBreizh dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2005, 11h22
  4. manipuler une bdd sql server en MFC ou excel ?
    Par roninou dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 18/10/2004, 11h51
  5. Réponses: 4
    Dernier message: 13/04/2004, 19h12

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