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 :

Comment historiser un dictionnaire dans une base SQLlite


Sujet :

Python

  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Comment historiser un dictionnaire dans une base SQLlite
    bonjour

    Je cherche à historiser un dictionnaire dans une base sqllite.

    ce code fonctionne sans difficulté mais je cherche à l'optimiser.

    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
    75
    76
    77
    78
    79
    # coding: utf-8  
    import sqlite3
     
     
    """
    -- TableTraduction definition
    -- prealable avoir une base sqllite dénomer 'rcg-fr.sqllite' dans la racice du projet avec la table 
    -- cette partie a été faite prealablement et n'est pas présente danc ce code
     
    CREATE TABLE TableTraduction (
        IdK INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
        Terme_Anglais TEXT,
        Terme_francais TEXT
    );
     
    CREATE INDEX TableTraduction_IdK_IDX ON TableTraduction (IdK);
    CREATE INDEX TableTraduction_Terme_Anglais_IDX ON TableTraduction (Terme_Anglais);
     
    DROP TABLE TableTraduction;
     
    """
     
     
    if __name__ == '__main__':
     
        Base_traduction = {
    "Bionic Hands Weapons and Tools" : "Main Bionique de type arme ou outils" , 
    "FingerJack" : "FingerJack (Doigt pistolet)" ,
    "Laser Utility Finger" : "Doigt laser" ,
    "Hand and Arm Weapons & Tools" :"Main ou bras  de type arme ou outils" ,
    "Pair of Additional Hands and Arms" : "Paire de mains et de bras supplémentaires" ,
    "Leg Weapons and Accessories"   : "Armes de jambe et accessoires" ,
    "Head and Throat Features"      : "Caractéristiques de la tête et de la gorge" ,
    "Bionic Eyes & Sensors"         : "Yeux et capteurs bioniques" ,
    "Cyborg Armor"                  : "Armure Cyborg" 
     }
     
     
        try: 
            # Etablir une connexion à la base de données 'rcg-fr.sqllite'
            # et créer un objet de connexion
            connection_rcgfr = sqlite3.connect('rcg-fr.sqllite')
            # Créer un curseur vers la base de données
            cur_rcgfr = connection_rcgfr.cursor()
            print("Ouverture de la base de données rcg-fr.sqllite")
     
            requete ='INSERT INTO TableTraduction (Terme_Anglais, Terme_francais) VALUES(?, ?)' 
     
            #Exécutions multiples
            for donnee_dic in Base_traduction:
                valeur = (donnee_dic ,Base_traduction[donnee_dic])
                print(valeur)
                cur_rcgfr.execute(requete, valeur)
     
            connection_rcgfr.commit()
            # vérification
     
            requete ='select  Terme_Anglais, Terme_francais from TableTraduction'  
     
            try:
     
                cur_rcgfr.execute(requete)
                result = cur_rcgfr.fetchall()  # fetchall() : récupère toutes les lignes
                print("-------------dico recreer--------------------------------")
                Base_traduction_2 = {None : None }
                Base_traduction_2.clear()
     
                for ligne in result:
                    Base_traduction_2[ligne[0]] = ligne[1]
     
                print(Base_traduction_2.items())    
            except  Exception as erreur:
                print("Erreur:" , erreur)   
                Base_traduction =''
        except  Exception as erreur:
            print("Erreur:" , erreur)
            connection_rcgfr.rollback()
        finally:    
            connection_rcgfr.close()
    Je cherche à l'optimiser sur la partie concernant l'enregistrement en base en utilisant plutôt une commande executemany()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...       for donnee_dic in Base_traduction:
                valeur = (donnee_dic ,Base_traduction[donnee_dic])
                print(valeur)
                cur_rcgfr.execute(requete, valeur)
     
            connection_rcgfr.commit()
    ...

    Le but global est de conserver le dictionnaire pour l'utiliser comme outils d'optimisation de traduction.
    on charge celui-ci au début des opérations, on lui apporte de nouvelle valeur et on le redépose dans la base.

    en réfléchissant je m’aperçois que le plus cohérent serait que la table soit plus proche du dictionnaire avec comme définition

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE TableTraduction2 (
        Terme_Anglais TEXT NOT NULL PRIMARY KEY,
        Terme_francais TEXT
    );
     
    CREATE INDEX TableTraduction_Terme_Anglais_IDX2 ON TableTraduction2 (Terme_Anglais);

    Serait-il plus pertinent de cloner cette table avec la base en RAM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connexion = sqlite3.connect(":memory:")  #BDD dans la RAM
    que d'utiliser un dictionnaire ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par dedalios Voir le message
    Serait plus pertinent de cloner cette table avec la base en RAM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connexion = sqlite3.connect(":memory:")  #BDD dans la RAM
    que d'utiliser un dictionnaire ?
    Déjà on peut se demander pourquoi sqlite plutôt qu'un fichier JSON (si on peut tout charger en mémoire) où on va pouvoir ajouter des entrées avec un simple éditeur de texte?

    Après tout dépend des query: pas être simple de coder l'équivalent d'une query avec des LIKE avec les clefs d'un dictionnaire.

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par dedalios Voir le message
    Je cherche à l'optimiser sur la partie concernant l'enregistrement en base en utilisant plutôt une commande executemany()
    en réfléchissant je m’aperçois que le plus cohérent serait que la table soit plus proche du dictionnaire avec comme définition
    Moi je me demande l'utilité d'une base de données (avec ses systèmes d'index, de contraintes, de clefs) pour un simple dictionnalre. Un simple dump pickle dans un fichier me semble plutôt suffisant.
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    import pickle
     
    if __name__ == '__main__':
     
    	t1 = {
    "Bionic Hands Weapons and Tools" : "Main Bionique de type arme ou outils" , 
    "FingerJack" : "FingerJack (Doigt pistolet)" ,
    "Laser Utility Finger" : "Doigt laser" ,
    "Hand and Arm Weapons & Tools" :"Main ou bras  de type arme ou outils" ,
    "Pair of Additional Hands and Arms" : "Paire de mains et de bras supplémentaires" ,
    "Leg Weapons and Accessories"   : "Armes de jambe et accessoires" ,
    "Head and Throat Features"	  : "Caractéristiques de la tête et de la gorge" ,
    "Bionic Eyes & Sensors"		 : "Yeux et capteurs bioniques" ,
    "Cyborg Armor"				  : "Armure Cyborg" 
    }
     
    	with open("svg.bin", "wb") as fp: pickle.dump(t1, fp)
    	with open("svg.bin", "rb") as fp: t2=pickle.load(fp)
    	print(t1 == t2)

    Citation Envoyé par dedalios Voir le message
    Serait-il plus pertinent de cloner cette table avec la base en RAM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connexion = sqlite3.connect(":memory:")  #BDD dans la RAM
    que d'utiliser un dictionnaire ?
    A mon avis non. Le dictionnaire est quand-même plus proche de Python que la bdd sqlite. Et aussi moins gourmand.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Reponse
    merci je vais suivre cette idee

  5. #5
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Déjà on peut se demander pourquoi sqlite plutôt qu'un fichier JSON (si on peut tout charger en mémoire) où on va pouvoir ajouter des entrées avec un simple éditeur de texte?

    Après tout dépend des query: pas être simple de coder l'équivalent d'une query avec des LIKE avec les clefs d'un dictionnaire.

    - W
    je ne connais pas JSON simplement. Ou du moins uniquement de façon général.

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

Discussions similaires

  1. Comment stocker un réel dans une base Access avec ADO ?
    Par thibouille dans le forum Bases de données
    Réponses: 1
    Dernier message: 27/11/2007, 08h59
  2. Réponses: 1
    Dernier message: 11/09/2006, 10h45
  3. Comment stocker des images dans une base de données ?
    Par [Silk] dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/07/2005, 11h29

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