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.