Forum Programmation.python message erreur sqlite3:OperationalError

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
31
mai
2016

Je débute dans la gestion des bases de données. J' ai fait un petit programme pour créer une base de donnée contenant 2 tables (description et espèce).
La création de la base et des tables ne pose pas de pb mais l'ajout d'enregistrement me fournit systématiquement le message d'erreur suivant :
Traceback (most recent call last):
File "/Users/francoissauret/Desktop/Fichiers Python/Medocs_Bizarres.py", line 98, in
BaseMedocs.AjouteEnr(Glob.dicoTablesChamps)
File "/Users/francoissauret/Desktop/Fichiers Python/Medocs_Bizarres.py", line 87, in AjouteEnr
cur.execute(req)
sqlite3.OperationalError: no such column: nom d'un champ

Je mouline la dessus depuis des heures et je ne comprends plus rien !!!!!!
je joins les scripts en python:

import sqlite3
import sys
from decrit_bd import *

class GestionBD(object):

"etablissement de la connexion, création du curseur"
def __init__(self):

    try:

       self.fichierMedocs=Glob.dbChemin

    except Exception as err:
       print("Erreur de création de la base de données !!!")

    else:
       self.conn=sqlite3.connect(self.fichierMedocs)

       print("Ouais !!!!")

def CreeTables(self,dicTables):

    cur=self.conn.cursor()

    req="CREATE TABLE "
    for clef in dicTables:
        req=req+clef+" ("
         for desc in dicTables[clef]:
            NomChamp=desc[0]
            if desc[1]=="k":
                TypeChamp="INTEGER PRIMARY KEY, "
            elif desc[1]=="i":
                TypeChamp="INTEGER, "
            elif desc[1]=="r":
                TypeChamp="REAL, "
            else:
                TypeChamp="TEXT, "
             req=req+NomChamp+" "+TypeChamp
         req=req[:-2]+") "    

        try:
            cur.execute(req)                      #ici ça marche#
        except:
            print("Raté!!!")
            pass         
         req="CREATE TABLE "
     cur.close()
    self.conn.close()
  def AjouteEnr(self,dicTables):
     liste=[]
    rep=[]
    req="INSERT INTO "
    self.conn=sqlite3.connect(self.fichierMedocs)
    cur=self.conn.cursor()
    i=0
    for clef in dicTables:
        print("Fichier : ",clef)
        req=req+clef+"("
        print(" ")
        for desc in dicTables[clef]:
            liste.append(desc[0])
            i+=1
            rep.append(input(desc[2]+" : "))
```            for el in liste:
                req=req+el+","
            req=req[:-1]+")"
            req=req+" VALUES("
            for el in rep:
                req=req+el+","
            req=req[:-1]+")"               
            print(req)
            cur.execute(req)                       #ici message d'erreur#
            req="INSERT INTO "
            print("")


BaseMedocs=GestionBD()

BaseMedocs.CreeTables(Glob.dicoTablesChamps)
BaseMedocs.AjouteEnr(Glob.dicoTablesChamps)

script de décrit_db:
class Glob(object):

Classe décrivant la structure de la SGBD Medocs_bizarres

dbChemin="/Users/francoissauret/Desktop/MedocsBizarres/Medocs_bizarres"
#Dictionnaire des tables et des champs#
dicoTablesChamps={"Description":[('idpactif',"k","Clef primaire"),
('Pactif',50,"Nom du principe actif"),('NomDep',50,"Nom déposé"),
('Conc',"r","Concentration"),('Unite',10,"Unité")]
,"Espece":[('idpactif',"i","Clef"),('NomEspece',30,"Espèce"),('Poso',"r","Posologie")
,('UnitPoso',10,"Unité"),('VoieAdmin',20,"Voie administration"),('Rythme',50,"Rythme administration")
]}

  • # Bonjour

    Posté par  . Évalué à 6. Dernière modification le 01 juin 2016 à 01:59.

    Pour commencer, pour poster ici, il faudrait que tu encadres ton code entre :

    ```python
    

    et
    ```

    parce que là c’est très chiant à lire…

    Tu imprimes ta requête ici :

    print(req)

    Quelle tronche elle a ? La visualisation de cette requête ne te permet pas de voir ce qui cloche ?

    sqlite3.OperationalError: no such column: nom d'un champ

    À priori tu essayes d’insérer une valeur dans un champ nommé : « nom d'un champ »… là comme ça je vois pas… ton code est pas super clair faut dire…

    Extrait de https://docs.python.org/3.5/library/sqlite3.html

    Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack (see https://xkcd.com/327/ for humorous example of what can go wrong).

    Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method.

    ça rend le code plus clair en plus.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.