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 :

erreur dans une entrée d'une donnée "random" sur sqlite3


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2014
    Messages : 49
    Points : 20
    Points
    20
    Par défaut erreur dans une entrée d'une donnée "random" sur sqlite3
    bonjour, je fais un petit code pour générer des codes aléatoire avec random, pas de problème. mais je veux l'enregistrer dans une basse de donner SqLite problème j'ai ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:\Users\lekev262\Desktop\Nouveau document.py", line 8, in <module>
        cur.execute("insert INTO tableau(ref) values('{0}')",format(id_generator()))
    sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 8 supplied.
    mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import sqlite3,random,string
    connex=sqlite3.connect("base de reference.db")
    cur=connex.cursor()
    def id_generator(size=8, chars=string.ascii_uppercase + string.digits):
            return ''.join(random.choice(chars) for _ in range(size))
     
    for i in range (0, 8) :#pour le teste je suis a 8 mais j'en ai 8000 a faire ... voir +
            cur.execute("insert INTO tableau(ref) values('{0}')",format(id_generator()))
    si c'est trop tiré par les cheveux je vais faire par CSV ...

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Étrange ta syntaxe, ce devrait être un point à la place de la virgule avant format()

    Essaye comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            cur.execute("insert INTO tableau(ref) values(?)", (id_generator(), ))
    Je suppose que tu sais ce que c'est que tableau(ref).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2014
    Messages : 49
    Points : 20
    Points
    20
    Par défaut
    j'ai déjà utiliser cette méthode a plusieurs reprise et elle fonctionne il permais aussi d'utiliser plusieurs fois une variable dans la même chaîne format() soit

    sinon j'ai déjà tester avec "...(?)", (id_generator()) sans la 2eme ","
    j'ai plus mon message d'erreur enfin ... sa n'enregistre pas pour autant dans la base de donner
    je doit refermer ma basse de donner une fois la génération fini ?

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ben non, il ne faut pas enlever la virgule finale, même si il n'y a qu'une valeur ce doit être un tuple.

    Et pour enregistrer réellement les données tu termines avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    connex.commit()
    connex.close()

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 465
    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 465
    Points : 9 257
    Points
    9 257
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par lekev262 Voir le message
    je doit refermer ma basse de donner une fois la génération fini ?
    Par défaut, l'enregistrement fonctionne sur le mode d'une transaction: il faut donc appliquer commit après le execute pour qu'il y ait un réel enregistrement.

    Voilà un petit code modèle (cnx=la connexion ouverte, cur=le curseur sur la connexion):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        try:
            cur.execute("xxxxxxxxxxx")
            ...
            cur.execute("yyyyyyyyyy")
            cnx.commit()
        except sqlite3.Error as msgerr:
            cnx.rollback()
            print("Erreur:", msgerr.args[0])
    L'avantage de la transaction, c'est que si les modifications de la base sont complexes et, par exemple, concernent plusieurs tables, le commit enregistre tout, mais en cas d'erreur, le rollback fait que rien n'est enregistré, même si c'est le nième execute qui l'a déclenché. Ainsi la base n'est jamais dans une situation "intermédiaire" qui serait dangereuse (pb d'intégrité).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2014
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2014
    Messages : 49
    Points : 20
    Points
    20
    Par défaut
    parfait sa marche merci a vous !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [MySQL] Erreur dans le chargement d'une base de donnée
    Par daniel1985 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/06/2012, 11h37
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. [SQL]Select dans une table d'une autre base de données
    Par Didouille dans le forum Access
    Réponses: 3
    Dernier message: 21/12/2005, 09h00
  5. erreur dans l'execution d'une requete
    Par marsupilami34 dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/09/2005, 16h47

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