Sqlite3.IntegrityError: UNIQUE constraint failed

Résolu/Fermé
Janken - Modifié le 11 févr. 2021 à 18:25
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 12 févr. 2021 à 10:22
Bonjour.

Je rencontre un petit problème avec ma base de données. En effet, lorsque je veux faire un enregistrement dans ma table d'emails, disposant d'une colonne pour l' identifiant (id) et d'une colonne pour l'email, l'erreur suivante m'est affichée : sqlite3.IntegrityError: UNIQUE constraint failed: emails.id.

Alors voilà mon petit programme en Python :
from tkinter import *
from random import *
from string import *
from random import *
from sqlite3 import *

# Base de données pour enregistrer les adresses électroniques
connection = connect('base.db')

# Curseur pour les requêtes vers le base de données
cursor = connection.cursor()

# Fenêtre
window = Tk()

# Fonction pour configurer un fond de couleur alétoire
def hexadecimal():
    bits = list(str(i) for i in range(10)) + list("ABCDEF")
    colorcode = "#"
    for i in range(6):
        colorcode = colorcode + choice(bits)
    return colorcode


# Caractéristiques de la fenêtre
window.title("Window")
window.minsize(720, 480)
window.config(background=hexadecimal())

# Frame
frame = Frame(window, bg=window['background'])

# Fonction pour générer une adresse électronique aléatoire
def generate_email():
    entry.delete(0, END)
    chars = ascii_lowercase + digits + "."
    email = sample(chars, randint(5, 10)) + list("@gmail.com")
    for i in email:
        email = "".join(email)
    entry.insert(0, email)
    cursor.execute("INSERT INTO emails values(?, ?)", (cursor.lastrowid, email))
    connection.commit()



# Widgets
entry = Entry(frame, bg=hexadecimal(), bd=2)
button = Button(frame, text="Click", background=hexadecimal(), bg=hexadecimal(), command=generate_email)

# Afficher les éléments
frame.pack(expand=YES)
entry.pack()
button.pack()

# Afficher la fenêtre
window.mainloop()

# Fermeture de la connexion à la base de données
connection.close()


Merci de votre aide.

1 réponse

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
11 févr. 2021 à 22:36
bonjour,
sur quelle ligne de code obtiens-tu cette erreur?
as-tu vérifié la valeur de
cursor.lastrowid
?
comment as-tu défini la table emails?
0
Rebonjour.
L'erreur a lieu au niveau de la ligne 41. Comme j'ai mis l'identifiant de ma table en auto-incrémentation, la valeur de cursor.lastrowid ne devrait logiquement pas poser de souci.
En fait, lorsque j'exécute le programme et je clique une fois sur le bouton qui déclenche la fonction d'enregistrement de l'e-mail, aucune erreur n'a lieu, mais lorsque je clique plus d'une fois, l'erreur se produit.
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Janken
12 févr. 2021 à 10:22
logiquement, il n'y a aucune raison de mettre un champ auto-incrémenté dans un INSERT. c'est même contr'indiqué, comme tu le constates.
si tu examines la valeur de
cursor.lastrowid
chaque fois, tu comprendras ce qui se passe.
-2