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 :

sqlite plusieurs requête dans une transaction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut sqlite plusieurs requête dans une transaction
    Bonsoir !!
    j'ai deux requête dans une boucle qui tourne énormément (au moins 1000000 fois).
    à l'intérieur j'ai deux requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    c.execute('INSERT INTO mots VALUES (?, ?)',[nMot, j])
    conn.commit()
    c.execute('INSERT INTO phrases VALUES (?, ?)',[i, nMot])
    conn.commit()
    vous voyez surement le pb !!
    ce que j'aimerai faire, c'est créer une chaine qui contiennent toutes ces requêtes et à la fin de la boucle faire une seule transaction.

    après j'ai vu que pour optimiser, on peut utiliser en plus cur.execute("pragma synchronous = off;")

    avez vous une idée de réaliser cette chaine, j'ai essayer avec +, ça marche pas, je vois pas trop comment faire là.

    merci d'avance

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Pour faire des insertions multiples, il y a quelques méthodes ici ( http://sqlpro.developpez.com/cours/sqlaz/dml/#LII ) mais encore faut-il que le SGBD l'ai implanté (donc avec sqlite, à mon avis, ca ne marchera pas, en tout cas, sous firebird ca ne marchait pas).

    Sinon, il faut passer par des tables externes. Avec la version de sqlite sous pyhton 2.5 (ca devait être la 2.3.2). Peut-être que cela fonctionne dans la dernière version (2.5.0 il me semble). Dans ce cas tu peux utiliser ce tutoriel ( http://gagneux.developpez.com/interbase/import-export/ ).

    De mon côté, c'est cette dernière méthode que j'utilise pour des bases Firebird 2.1.1 (la première méthode ne fonctionnant pas).

    Peut-être peux-tu dans ce cas-là envisager l'utilisation d'un autre sgbd

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    j'ai trouvé qu'il y avait
    la commande
    cursor.executescript(sql).
    le souci maintenant, c la concaténation de sql.

    en effet, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    c.execute('INSERT INTO mots VALUES (?, ?)',[nMot, j.decode("cp1252")])
    conn.commit()
    c.execute('INSERT INTO phrases VALUES (?, ?)',[i, nMot])
    conn.commit()
    Il faut que je concaténe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chaine =  'INSERT INTO mots VALUES (?, ?)',[nMot, j.decode("cp1252")] +'INSERT INTO phrases VALUES (?, ?)',[i, nMot]
    c.executescript(chaine)
    j'ai essayé beaucoup de chose, mais en vain

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 16
    Par défaut
    à mon avis du doit juste mettre le commit hors de ta boucle

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    je baisse les bras.
    j'avais choisi une base de donnée pour accélerer le remplissage de ma matrice.
    mais finalement, je vais revenir sur mon idée de base, l'écriture dans un fichier.
    c'était long, mais je crois que je vais prendre le principe de bufferiser un max ma chaine, et d'écrire d'un seul coup dans le fichier car avant j'écrivais à chaque boucle
    f.write(etc.....) (et plusierus à la suite) donc c'était normal que ça dure très longtemps
    donc le mieux, c'est de bufferiser un max la chaine, et de l'écrire d'un seul coup

    et je pense que ça va être plus rapide. de toute manière, j'ai presque terminé mon projet, j'ai plus trop le temps de le refaire en passant par un bd.
    En espérant que le bufferisation fonctionne sinon je vais devoir laisser mon PC calculer pendant des jours

    merci encore

  6. #6
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    Salut,

    c'est vrai j'arrive après la guerre vu la date des derniers commentaires, mais ça peux servir à quelqu'un qui tombe dessus.

    Voici une page intéressante pour l'optimisation de sqlite :
    http://web.utk.edu/~jplyon/sqlite/SQ...ation_FAQ.html

    Pour le problème cité précédemment il faudrait faire comme ça (je pense) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    c.execute('BEGIN']
    for ...:
       c.execute('INSERT INTO mots VALUES (?, ?)',[nMot, j])
       c.execute('INSERT INTO phrases VALUES (?, ?)',[i, nMot])
     
    c.execute('END']
    conn.commit()
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    c.execute('BEGIN']
    for ...:
       c.execute('INSERT INTO mots VALUES (?, ?)',[nMot, j])
       c.execute('INSERT INTO phrases VALUES (?, ?)',[i, nMot])
     
       # Pour par exemple commiter toutes les 50 000 lignes.
       if nb == 50000:
          c.execute('END']
          conn.commit()
          c.execute('BEGIN']
     
    conn.commit()

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/01/2014, 18h45
  2. [C#/MySQL] Peut-on faire plusieurs requêtes dans une Transaction ?
    Par Ben42 dans le forum Accès aux données
    Réponses: 5
    Dernier message: 01/02/2011, 09h16
  3. [AC-2007] Plusieurs requêtes dans une seule liste déroulante
    Par Razorback dans le forum IHM
    Réponses: 5
    Dernier message: 29/04/2009, 14h09
  4. Réponses: 3
    Dernier message: 11/07/2008, 17h12
  5. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54

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