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 :

Inserer données dans SQLITE3


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut Inserer données dans SQLITE3
    Bonjour

    Débutant en python , je galère pour insérer des données dans un table sqlite.
    Si j’insère une donnée seule (dates,index,metres cubes) ça fonctionne.
    c'est quand j’insère une des données provenant de variable.
    Pour info j'importe mes données d'un fichier xls avec le module xlrd et aussi le module sqlite3
    j'ai essayé plusieurs façon parenthèse, crochet, sans , a chaque fois j'ai un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for c in insert:
        print("c : ",c)
        print("len de c :", len(c))
        sql_insert ="""INSERT INTO sdei (Dates,Releve,Metres_cubes) VALUES (?, ?, ?)"""
        cursor.execute(sql_insert, [c])
    Donne :
    sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied.
    Voici une partie de code :
    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
     
    print("Nb de lignes : ", nb_ligne())
    print("Dates :", dates(nb_ligne()))
    print("Index compteur:", index_compteur(nb_ligne()))
    print("Metres Cube :", metre_cubes(nb_ligne()))
     
    print("------------------")
    d = dates(nb_ligne())
    i = index_compteur(nb_ligne())
    m = metre_cubes(nb_ligne())
    print()
    insert = [d,i,m]
    print("insert : ", insert)
     
    print("Len de insert :",len(insert))
    for c in insert:
        print("c : ",c)
        print("len de c :", len(c))
        sql_insert ="""INSERT INTO sdei (Dates,Releve,Metres_cubes) VALUES (?, ?, ?)"""
        cursor.execute(sql_insert, [c])
     
     
     
    conn.commit()
     
    conn.close()
    print("Fin du programme")
    et la sortie :
    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
     
    Nb de lignes :  6
    Dates : ['01-08-2021', '02-08-2021', '03-08-2021', '04-08-2021', '05-08-2021', '06-08-2021']
    Index compteur: [185.289, 185.316, 185.329, 185.364, 185.371, 185.371]
    Metres Cube : [0.142, 0.027, 0.013, 0.035, 0.007, 0.0]
    ------------------
     
    insert :  [['01-08-2021', '02-08-2021', '03-08-2021', '04-08-2021', '05-08-2021', '06-08-2021'], [185.289, 185.316, 185.329, 185.364, 185.371, 185.371], [0.142, 0.027, 0.013, 0.035, 0.007, 0.0]]
    Len de insert : 3
    c :  ['01-08-2021', '02-08-2021', '03-08-2021', '04-08-2021', '05-08-2021', '06-08-2021']
    len de c : 6
    Traceback (most recent call last):
      File "/home/thierry/PycharmProjects/debutpython/venv/pythonProject/main.py", line 85, in <module>
        cursor.execute(sql_insert, [c])
    sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied.
     
    Process finished with exit code 1
    Je ne sais plus trop quoi faire et a force de forum ou il n'indique pas la même chose je suis un peu perdu et je pense que j'ai mélangé toutes les méthodes
    J'ai essayé aussi de ne pas passer par la boucle et d'appeler directement insert , mais c'est pareil
    Quand je ne passe la ligne sql_insert et cursor.execute dans la boucle , la sortie est légèrement différente car la boucle s'éxecute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for c in insert:
        print("c : ",c)
        print("len de c :", len(c))
    sql_insert ="""INSERT INTO sdei (Dates,Releve,Metres_cubes) VALUES (?, ?, ?)"""
    cursor.execute(sql_insert, [insert])
    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
     
    insert :  [['01-08-2021', '02-08-2021', '03-08-2021', '04-08-2021', '05-08-2021', '06-08-2021'], [185.289, 185.316, 185.329, 185.364, 185.371, 185.371], [0.142, 0.027, 0.013, 0.035, 0.007, 0.0]]
    Len de insert : 3
    c :  ['01-08-2021', '02-08-2021', '03-08-2021', '04-08-2021', '05-08-2021', '06-08-2021']
    len de c : 6
    c :  [185.289, 185.316, 185.329, 185.364, 185.371, 185.371]
    len de c : 6
    c :  [0.142, 0.027, 0.013, 0.035, 0.007, 0.0]
    len de c : 6
    Traceback (most recent call last):
      File "/home/thierry/PycharmProjects/debutpython/venv/pythonProject/main.py", line 85, in <module>
        cursor.execute(sql_insert, [insert])
    sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied.
     
    Process finished with exit code 1
    j'ai essayé aussi executemany , ça ne fonctionne pas mieux
    Merci
    Thierry

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

    Le nombre de '?' de la chaine de caractères passée en 1er argument doit correspondre au nombre d'items de la séquence/tuple/liste passée en paramètre.

    Programmer est un exercice de compréhension: çà ne va pas tomber en marche "par hasard" mais parce que vous respectez certaines règles qui sont énoncées dans la documentation de sqlite3 et que l'on ne pourra comprendre qu'après avoir passé du temps à maîtriser les bases du langage.

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

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut
    Bonjour

    Merci pour la réponse ,donc si j'ai bien compris ce que tu m'a dit j'ai pris la documentation sqlite et que j'ai essayé d'appliquer .
    Donc si je prends l'exemple de sqlite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    cur.execute("create table lang (name, first_appeared)")
     
    # This is the qmark style:
    cur.execute("insert into lang values (?, ?)", ("C", 1972))
     
    # The qmark style used with executemany():
    lang_list = [
        ("Fortran", 1957),
        ("Python", 1991),
        ("Go", 2009),
    ]
    cur.executemany("insert into lang values (?, ?)", lang_list)
    j'applique avec mes valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    print("Creation de la table")
    createtable = '''CREATE TABLE IF NOT EXISTS sdei(id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, Dates DATE,Releve REAL,
                    Metres_cubes REAL) '''
    cursor.execute(createtable)
     
    insert = [(d),(i),(m)]
    print("insert : ", insert)
    print("Len de insert :",len(insert))
    sql_insert ="""INSERT INTO sdei (Dates,Releve,Metres_cubes) VALUES (?, ?, ?)"""
    cursor.executemany(sql_insert, insert)
    ou create table Dates, Relevé, Metres_cubes remplace create table lang (name, first_appeared) donc 3 champs 2 pour l'exemple
    On est d'accord que les points d'interrogation correspond à : ?, ? => Fortran, 1957 donc pour moi le résultat de mes variables , ?, ? => d,i,m
    puis a la fin j'appelle ma variable Lang_list pour l'exemple et insert pour mon code
    donc voici le résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    insert :  [['01-08-2021', '02-08-2021', '03-08-2021', '04-08-2021', '05-08-2021', '06-08-2021'], [185.289, 185.316, 185.329, 185.364, 185.371, 185.371], [0.142, 0.027, 0.013, 0.035, 0.007, 0.0]]
    Len de insert : 3
    Traceback (most recent call last):
      File "/home/thierry/PycharmProjects/debutpython/venv/pythonProject/main.py", line 81, in <module>
        cursor.executemany(sql_insert, insert)
    sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 3, and there are 6 supplied.
    Donc cela ne fonctionne toujours pas , et bien sur je ne trouve nulle part d'exemple comme le mien , sinon je n'aurais pas posté sur le forum, a chaque fois ils insèrent directement les valeurs dans la variable et jamais avec autant de données qui viennent d'importation , car si je fait comme l'exemple avec ça fonctionne , donc ou est l'erreur ?
    Merci
    Bonne soirée
    Thierry

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

    Citation Envoyé par tmax Voir le message
    Donc ou est l'erreur ?
    Il faut apprendre à compter jusqu'à 3 (puisqu'il y a 3 ? dans la requête).

    Si vous voulez insérer plusieurs lignes à la fois avec executemany, il va falloir lui passer une liste de listes contenant 3 items chacun (et pas 3 listes contenant 6 items).

    Il n'y a rien de plus dans l'exemple de la documentation.

    Une requête avec 2 ? - "insert into lang values (?, ?)" - qu'on peut appeler avec execute et un tuple à 2 items ou avec executemany avec une liste de tuple à 2 items.

    Citation Envoyé par tmax Voir le message
    Merci pour la réponse ,donc si j'ai bien compris ce que tu m'a dit j'ai pris la documentation sqlite et que j'ai essayé d'appliquer .
    C'est bien d'avoir pris le temps d'ouvrir la documentation mais concrètement vous ne comprenez pas qu'elle raconte: il vous manque les bases pour en faire quelque chose.

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

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut
    bonsoir

    effectivement je n'ai peu être pas tout compris , mais j'aurais aimé avoir un exemple concret c'est comme cela que je comprend , donc je reviendrai vous voir dans quelques années quand je serais un élite et que je n'aurais plus besoin de vos service, car a par me dire de consulter la doc, me dire que je ne sais pas compter et me dire qu'il faut apprendre les bases, plutôt que de me montrer comment cela fonctionne , excusez moi pour le dérangement.
    Pour info si je demande de l'aide c'est qu'effectivement je n'ai peut pas tout compris et c'est pas me renvoyant a celle ci que je comprendrais mieux.
    bonne soirée
    Thierry

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    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 742
    Par défaut
    Citation Envoyé par tmax Voir le message
    mais j'aurais aimé avoir un exemple concret c'est comme cela que je comprend
    La documentation vous donne un exemple "concret".

    Votre problème est qu'un tableau de dimension 3x6 n'est pas la même chose qu'un tableau 6x3.

    Comment s'y retrouver la dedans? moi, je préfère parler de lignes et de colonnes, histoire de faire la différence.
    Et chacun trouvera les analogies qui l'aideront à s'y retrouver.

    Puis, il faut traduire çà avec Python en listes de tuples/listes... et s'assurer que ce qu'on a fabriqué est bien ce qu'on attend.

    C'est là ou il faut maîtriser un peu les bases de la programmation: s'assurer que la machine fabrique bien ce qu'on attend et comprendre l'erreur qu'on a pu faire lorsque çà ne marche pas.
    Ce n'est pas trivial... et si on n'a pas pris le temps de se former, on est perdu parce que tout étant abstrait, on a des difficultés à se raccrocher à quelque chose.

    Citation Envoyé par tmax Voir le message
    Pour info si je demande de l'aide c'est qu'effectivement je n'ai peut pas tout compris et c'est pas me renvoyant a celle ci que je comprendrais mieux.
    Fabriquer des listes à 2 dimensions, c'est juste ce qu'on apprend dans les tutos avec les boucles imbriquées.
    Et si vous avez sauté le chapitre, ben vous ne savez pas... et on ne pourra pas vous expliquer mieux que ce que vous y trouveriez par vous même.

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

Discussions similaires

  1. inserer donnée dans formulaire et sous formulaire
    Par cbleas dans le forum Windows Forms
    Réponses: 0
    Dernier message: 18/12/2014, 18h43
  2. [XL-2010] Inserer données dans MsSQL depuis Excel
    Par ganjakass dans le forum Excel
    Réponses: 1
    Dernier message: 06/02/2014, 09h01
  3. inserer données dans une table excel
    Par leoppina dans le forum ASP.NET
    Réponses: 1
    Dernier message: 07/09/2011, 20h03
  4. [MySQL] inserer donnée dans base de donnée
    Par groskanel dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 19/06/2009, 11h57
  5. Inserer du texte à une position donnée dans un Memo
    Par bassim dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/11/2005, 17h45

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