Erreur Python Sqlite3: near "%": syntax error

Bonjour,
J’ai un problème qui m’échappe, lors du deboguage se déroule bien jusqu’à la ligne " cur.execute(sql, val)" les variables on leurs valeurs, sa saute directement a la ligne « except Exception as e: » . A la ligne "print " le message d’erreur est « near « % »: syntax error »


def Ajouter():
    matricule = txtNumero.get()
    fournisseur = txtfournisseur.get()
    telephone = txtTelephone.get()
    produit = comboproduit.get()
    prix_achat = txtPrix.get()
    quantite_achte = txtQuantite.get()

    con = sqlite3.connect('achat.db')
    cur = con.cursor()

    try:
        sql ="INSERT INTO tb_achat (matricule, fournisseur, telephone, produit, prix_achat, quantite_achte) VALUES (%s, %s, %s, %s, %s, %s)"
        val = (matricule, fournisseur, telephone, produit, prix_achat, quantite_achte)
        cur.execute(sql, val)
        con.commit()
        derniereMatricule = cur.lastrowid
        messagebox.showinfo("Information", "Achat ajouter")
        root.destroy()
        call(["python", "Achats.py"])

    except Exception as e:
        print(e)
        # retour
        con.rollback()
        con.close()

quelqu’un aurait-il une suggestion a me soumettre ?
cordialement
kyrob

Remplacez cette ligne:

par celle-ci:

sql ="INSERT INTO tb_achat (matricule, fournisseur, telephone, produit, prix_achat, quantite_achte) VALUES (?, ?, ?, ?, ?, ?)"

et voir si cela résolu votre problème.

bonjour Isaac,
le problème est toujours la.
l’erreur a changer print(e) est : table tb_achat has no column named quantite_achte.

j’ai joint le listing en entier après quelque minute.
cordialement.
kyrob

Bonjour Isaac, c’a marche, une faute de frappe dans la base de donnée

merci
cordialement
kyrob

Bonjour Isaac,
astuce pour imprimer les print dans le python.
##############
#!/usr/bin/python page-de fichier etudiant.py python

-- coding: utf-8 -- → formulaire d’impression ordinateur sqlite3

Python 3.10.2 →

import sqlite3
import sys,io,os
import tkinter as tk

router tous les print dans une StringIO

oldstd=sys.stdout
sys.stdout=io.StringIO()

… suite de print’s

afficher stat:

con = sqlite3.connect(« credataordi.db »)
cur = con.cursor()

print(« Connexion reussie a sqlite »)

cur.execute(« select * from formordi »)

rows = cur.fetchall()

if len(rows)!=0:

for row in rows:
    print("Id : ",(row[0])),                  # id
    print("Nom : ",(row[1])),                 # Nom / cartemere
    print("Carte mère : ",(row[2])),          # cartemere
    print("Processeur :",(row[3])),           # Processeur
    print("Nomb coeurs : ",(row[4])),         # Coeurs
    print("Nombr threads : ",(row[5])),       # Threads
    print("Frequence : ",(row[6])),           # Frequence
    print("Socket : ",(row[7])),              # Socket
    print("Memoire ram : ",(row[8])),         # RAM
    print("Disk ssd : ",(row[9])),            # SSD
    print("Adresse MAC : ",(row[10])),        # AdresMac
    print("Carte graphique : ",(row[11])),    # Carte Graph.
    print("Memoire graphique :",(row[12])),   # Memoire graph.
    print("Chipset : ",(row[13])),            # Chipset
    print("Type stockage : ",(row[14])),      # Type stock.
    print("Système : ",(row[15])),            # System
    print("Remarque : ", (row[16])),          # Remarque
    print("**************************************")

# print("fichier fermer")    

con.commit()
con.close()

print(« Fin »)

en fin de génération du texte :

tmp_name=« fichier_test.txt »
with open(tmp_name,« w ») as tmp :
tmp.write(sys.stdout.getvalue()) # texte à imprimer dans fichier temporaire

imprimer le fichier temporaire via la commande ‹ notepad /P ›

with open(tmp_name,‹ r ›) as tmp :
os.system('notepad /P '+tmp_name)
os.remove(tmp_name) # supprimer le fichier temporaire

restaurer le routage standard de stdout :

sys.stdout=oldstd # en principe, sys.stdout ferait l’affaire

def quitte(self):
exit()

#############
cordialement
kyrob