Sqlite3.IntegrityError: UNIQUE constraint failed

Signaler
-
Messages postés
14405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 mars 2021
-
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

Messages postés
14405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 mars 2021
807
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?
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.
Messages postés
14405
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
1 mars 2021
807 > Janken
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.