CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[PYTHON] Erreur "sqlite3.OperationalError: no such column:" avec SQL

huawai
huawai
Niveau 6
02 mai 2021 à 16:58:20

Salut,

J'ai une erreur qui me bloque depuis deux jours que j'ai pas réussis à corriger meme avec de l'aide.

J'ai fais un programme qui crée une base de donée SQL avec des aliments, et recettes, ainsi que leur kcal associées.
J'avais fais un précédent topic que j'ai supprimé par accident

J'ai fais des boutons sur tkinter pour ajouter des aliments et recette et ca marche parfaitement, mais les boutons supprimer et afficher (aliment ou recette) ne marchent pas, avec toujours la meme erreur : sqlite3.OperationalError: no such column: [ce que je tape]

J'ai crée mes tables comme cela :

data_aliments = sqlite3.connect('aliments2.db')

a = data_aliments.cursor()
a.execute("""CREATE TABLE liste_aliments("aliment" str, "kcal" float)""")

data_recettes = sqlite3.connect('recettes.db')

r = data_recettes.cursor()
r.execute("""CREATE TABLE liste_recettes("nom_recette" str, "aliment" str ,"poid" float)""")

j'avais essayé text à la place le str pour voir si ca changeait mais pas d'influence

Et voila les lignes où le problème arrive :

def supp_aliment():

a.execute("DELETE from liste_aliments WHERE aliment= " + entry.get()) ##### Erreur
data_aliments.commit()

et

def print_aliment():

a.execute("SELECT * FROM liste_aliments WHERE aliment="+entry.get()) #### Erreur
b = a.fetch()
data_aliments.commit()

La case entry étant là où je tape le nom de l'aliment sur tkinter. J'ai toujours l'erreur "no such column" alors qu'en méttant directement le nom de l'aliment dans les guillemet par exemple comme ceci :

def supp_aliment():

a.execute("DELETE from liste_aliments WHERE aliment = 'farine' ")
data_aliments.commit()

Ca marche parfaitement.

On dirait que la fonction cherche une collone qui s'apelle "farine" alors que ca devrait etre une ligne qu'elle cherche, parmis la collone aliment.

Une idée d'où ca pourrait venir ?

Message édité le 02 mai 2021 à 17:01:34 par huawai
Gewrky
Gewrky
Niveau 25
02 mai 2021 à 17:34:27

Je suis pas expert en Python, mais je suis meilleur en SQL.

Dans ta ligne : a.execute("SELECT * FROM liste_aliments WHERE aliment="+entry.get())
Il manque des ' '.

Regarde : entry.get() renvoie farine
Sauf que SQL, il connait pas farine. Par contre, 'farine' il reconnait que c'est une chaine de caractère.

Essaie :
a.execute("SELECT * FROM liste_aliments WHERE aliment=" + ' + entry.get() + ')

Message édité le 02 mai 2021 à 17:37:10 par Gewrky
godrik
godrik
Niveau 30
02 mai 2021 à 17:44:22

Jamais de la vie tu ne construit une requete SQL en concatenant des chaines de caractere. C'est comme ca que tu cree des fautes d'injection SQL qui sont des bombes a retardement. La version humoristique de pourquoi tu ne fait pas ca est https://xkcd.com/327/

A la place, toutes les bibliothques SQL ont des genre de requetes parametriques. Il y a une exemple dans la doc de sqlite3: https://docs.python.org/3/library/sqlite3.html que je copie ici:

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table lang (lang_name, lang_age)")

# This is the qmark style:
cur.execute("insert into lang values (?, ?)", ("C", 49))

# The qmark style used with executemany():
lang_list = [
    ("Fortran", 64),
    ("Python", 30),
    ("Go", 11),
]
cur.executemany("insert into lang values (?, ?)", lang_list)

# And this is the named style:
cur.execute("select * from lang where lang_name=:name and lang_age=:age",
            {"name": "C", "age": 49})
print(cur.fetchall())

con.close()

Probablement, le probleme est que la requete SQL est mal forme par un espace qui devrait etre echape ou un truc comme ca. Probablement, l'utilisation de requete parametrique va corriger le probleme.

Gewrky
Gewrky
Niveau 25
02 mai 2021 à 17:48:20

Au temps pour moi.
J'ai juste un petit niveau BTS :hap:

Tout ce que je veux dire, c'est que la requête SQL est fausse parce qu'il manque des ' '.

Mais merci je note.

huawai
huawai
Niveau 6
02 mai 2021 à 18:09:26

Le 02 mai 2021 à 17:34:27 :
Je suis pas expert en Python, mais je suis meilleur en SQL.

Dans ta ligne : a.execute("SELECT * FROM liste_aliments WHERE aliment="+entry.get())
Il manque des ' '.

Regarde : entry.get() renvoie farine
Sauf que SQL, il connait pas farine. Par contre, 'farine' il reconnait que c'est une chaine de caractère.

Essaie :
a.execute("SELECT * FROM liste_aliments WHERE aliment=" + ' + entry.get() + ')

J'avais pensé à ca en effet mais je voyais pas comment le mettre sous forme de chaine.

J'ai essayé ta ligne mais du coup ca me donne " sqlite3.OperationalError: near "(": syntax error " :(

Godrik >>>>> J'ai pas tout compris mais j'ai trouvé un openclassroom qui explique les requettes merci !

Je connaissais ni sql ni tkinter il y a une semaine donc j'ai fais au fur et à mesure en regardant des vidéos youtube, j'avais trouvé cette facon de faire sur une chaine de codémy où ca fonctionnait bien.

J'en conclue donc que ce que j'ai fait pour l'enregistrement des aliments est aussi faux ?

def enreg():

r.execute("INSERT INTO liste_recettes VALUES(:nom_recette, :aliment, :poid)",{'nom_recette':r_entry.get(),'aliment':entry.get(),'poid':entry1.get()})
r_entry.delete(0, "end")
entry.delete(0, "end")
entry1.delete(0, "end")
data_recettes.commit()

godrik
godrik
Niveau 30
02 mai 2021 à 18:11:35

Gewrky, en vrai on a poste en meme temps. :) Je commentais pour OP.
Construire les requetes SQL en concatenant des chaines de caracteres est probablement l'erreur majeure la plus commune qu'on voit et qui est lie aux bases de donnees.

huawai
huawai
Niveau 6
02 mai 2021 à 18:18:30

Ca marche, je vais changer tout ca et j'up le topic en temps voulu :ok:

Azerban
Azerban
Niveau 16
02 mai 2021 à 19:05:31

Il y a cette vidéo pas mal pour apprendre à utiliser SQlite avec Python : https://www.youtube.com/watch?v=pd-0G0MigUA

huawai
huawai
Niveau 6
02 mai 2021 à 19:25:41

Le 02 mai 2021 à 19:05:31 :
Il y a cette vidéo pas mal pour apprendre à utiliser SQlite avec Python : https://www.youtube.com/watch?v=pd-0G0MigUA

Merci, j'ai trouvé vers la fin une solution avec des tuples

J'ai changé la fonction supp pour mettre ca à la place :

def supp_aliment():

a.execute("DELETE FROM liste_aliments WHERE aliment = ?",(entry.get(),))
data_aliments.commit()

Et ca fonctionne.
Je vais rester la dessus pour l'instant et relire plus sur les requetes paramétriques pour corriger plus tard car c'est pas du tout clair pour l'instant

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment