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

Bibliothèques tierces Python Discussion :

bdd Sqlite et signal d'ajout/modif


Sujet :

Bibliothèques tierces Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    septembre 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 49
    Points : 34
    Points
    34
    Par défaut bdd Sqlite et signal d'ajout/modif
    Bonjour,

    Voilà, je cherche une astuce pour récupérer un signal à la première modification apportée à une bdd sqlite, je donne ici un bout de code à titre d'exemple,

    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
    #!/usr/bin/python
     
    import sqlite3
    import random
     
    def notif_modif():
        print("un modif de la bdd a eu lieu, conn.execute à été exécuté")
     
    conn = sqlite3.connect(':memory:')
     
    print("Opened database successfully")
    conn.execute('''CREATE TABLE COMPANY
             (ID INT PRIMARY KEY     NOT NULL,
             NAME           TEXT    NOT NULL,
             AGE            INT     NOT NULL,
             ADDRESS        CHAR(50),
             SALARY         REAL);''')
    print("Table created successfully")
     
    toto=random.randint(0,10)
    if toto > 5:
        conn.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
          VALUES (1, 'Paul', 32, 'California', 20000.00 )");
        #notif_modif()
    print(toto)
     
    conn.close()
    maintenant, imaginons que j'ai plein de fichiers avec plus d'une centaine de conn.execute (et compagnie), j'aimerai éviter d'appeler d'appelé notif_modif à chaque fois que celà se produit

    est ce que sqlite permet de générer un signal pour alerter d'une modification du contenu de la bdd ? une sorte de "conn.data_changed.connect(notif_modif)" ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 998
    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 : 17 998
    Points : 31 127
    Points
    31 127
    Par défaut
    Salut,

    Il n'y a pas "d'astuce": soit sqlite3 le supporte soit il faut faire sans.
    On ouvre la documentation de sqlite3 et on y trouve "Data Change Notification Callbacks"... Chouette.
    Reste à chercher sur Internet ou dans la documentation de Python sqlite3 comment on fabrique le "hook".

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

  3. #3
    Nouveau membre du Club
    Inscrit en
    septembre 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Merci pour cette réponse rapide.
    Je viens de jeter un oeil à la doc https://docs.python.org/3/library/sqlite3.html et je ne trouve pas grand chose de parlant (pour moi en tout cas) à part "set_progress_handler".
    Pour le hook, j'ai vu ça https://stackoverflow.com/questions/...ernal-database, ça date de 2017 et ça va plutot dans le sens que ce n'est pas possible

    Voilà ce que le code donne avec set_progress_handler

    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
    #!/usr/bin/python
     
    import sqlite3
     
    i=0
    def notif_modif():
        global i
        i=i+1
     
    conn = sqlite3.connect(':memory:')
     
    print("Opened database successfully")
    conn.execute('''CREATE TABLE COMPANY
             (ID INT PRIMARY KEY     NOT NULL,
             NAME           TEXT    NOT NULL,
             AGE            INT     NOT NULL,
             ADDRESS        CHAR(50),
             SALARY         REAL);''')
    print("Table created successfully")
     
    conn.set_progress_handler(notif_modif,1)
     
    conn.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
          VALUES (1, 'Paul', 32, 'California', 20000.00 )");
        #notif_modif()
     
    print("un modif de la bdd a eu lieu, conn.execute à été exécuté : ", i)
     
     
    conn.close()
    la bonne nouvelle est que j'arrive bien a appelé la fonction notif_modif, par contre elle est appelé 25 fois alors que je n'ai qu'un "execute", je fais donc peut être fausse route

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Opened database successfully
    Table created successfully
    un modif de la bdd a eu lieu, conn.execute à été exécuté :  25

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 998
    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 : 17 998
    Points : 31 127
    Points
    31 127
    Par défaut
    Salut,

    Si vous regardez la documentation de sqlite3, çà cause d'une fonction C dénommée sqlite3_update_hook permettant de déclarer un handler qui a un prototype bien plus fourni.

    Par ailleurs, set_progress_handler est documentée dans Python sqlite3 comme permettant d'appeler un handler toutes les N instructions de la machine virtuelle de sqlite3.

    Rien à voir.

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

  5. #5
    Nouveau membre du Club
    Inscrit en
    septembre 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    merci pour cette réponse,
    je suis débutant et pas informaticien, l'utilisation d'une fonction C dans python ou même la notion de handler ne sont pas du tout clair pour moi,
    un exemple/doc plus parlant est le bienvenu

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 998
    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 : 17 998
    Points : 31 127
    Points
    31 127
    Par défaut
    Salut,

    Citation Envoyé par toitoinebzh Voir le message
    un exemple/doc plus parlant est le bienvenu
    Si j'avais à écrire cela, je commencerai par chercher sur Internet (et c'est ce que je vous ai proposé).

    Chercher sur Internet, c'est pas de la programmation.

    D'autant que vous avez un exemple de code dans les références mentionnées dans les articles que vous avez trouvé.

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

  7. #7
    Nouveau membre du Club
    Inscrit en
    septembre 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    j'ai bien fait une recherche sur le net, si je passe sur le forum, c'est que ma recherche a été infructueuse, je ne dois pas avoir les bons mot clefs
    concernant la doc python, elle ne fait pas référence à sqlite3_update_hook donc je ne sais pas comment faire

    en testant les fonctions dispo, je vois que "set_trace_callback" peut peut-être faire l'affaire, après un test, je vois que la fonction capte bien que "conn.execute" a été lancé, par contre la fonction notif_modif est lancé même quand l'instruction sql ne modifie pas la base de donnée, ce qui ne m'arrange pas

    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
    #!/usr/bin/python
     
    import sqlite3
     
    i=0
    def notif_modif(*args):
        global i
        i=i+1
        #print(*args)
     
    conn = sqlite3.connect(':memory:')
     
    print("Opened database successfully")
    conn.execute('''CREATE TABLE COMPANY
             (ID INT PRIMARY KEY     NOT NULL,
             NAME           TEXT    NOT NULL,
             AGE            INT     NOT NULL,
             ADDRESS        CHAR(50),
             SALARY         REAL);''')
    print("Table created successfully")
     
    conn.set_trace_callback(notif_modif)
     
    #conn.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
    #      VALUES (1, 'Paul', 32, 'California', 20000.00 )");
    conn.execute("BEGIN;")
     
    print("un modif de la bdd a eu lieu : ", i)
     
     
    conn.close()

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    17 998
    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 : 17 998
    Points : 31 127
    Points
    31 127
    Par défaut
    Salut,

    Citation Envoyé par toitoinebzh Voir le message
    j'ai bien fait une recherche sur le net, si je passe sur le forum, c'est que ma recherche a été infructueuse, je ne dois pas avoir les bons mot clefs
    Vos mots clefs ne sont pas si mauvais puisque vous trouvez des articles.
    Mais si vous ne les lisez pas c'est autre chose!

    Regardez l'article que vous avez mentionné.

    Il parle d'un autre article dans lequel il y a du code exploitable.

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 07/07/2010, 16h30
  2. delete ajout modif dans la BDD
    Par jojojojo57 dans le forum Bases de données
    Réponses: 8
    Dernier message: 19/03/2007, 20h38
  3. Ajout & modif d'une table vers l'autre
    Par BOTIGUA dans le forum Access
    Réponses: 1
    Dernier message: 17/02/2006, 18h00
  4. Réponses: 5
    Dernier message: 11/10/2005, 15h39

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