AttributeError: module 'mysql.connector.cursor' has no attri

Fermé
Frewil - 18 févr. 2022 à 16:00
 Frewil - 24 févr. 2022 à 15:57
Bonjour,

Lorsque le morceau de script ci-dessous s'execute, le message
"AttributeError: module 'mysql.connector.cursor' has no attribute 'execute'"
est affiché.
Je n'arrive pas à comprendre ce qui est faut dans mon code.
Merci pour votre aide.


 def treeview_for_electricite_database():
        tree_elec = Treeview(window_electricite, columns=("Id", "Date", "Montant", "Référence"), show="headings")
        tree_elec.heading('Id', text="Id")
        tree_elec.heading('Date', text="Date")
        tree_elec.heading('Montant', text="Montant")
        tree_elec.heading('Référence', text="Référence")
        tree_elec.column("Id", anchor=CENTER, width=20)
        tree_elec.column("Date", anchor=CENTER, width=70)
        tree_elec.column("Montant", anchor=CENTER, width=70)
        tree_elec.column("Référence", anchor=CENTER, width=70)
        tree_elec.place(x=420, y=25)

        cursor.execute("SELECT * FROM Electricite")
        result_elec = cursor.fetchall()
        for row in result_elec:
            tree_elec.insert('', 'end', values=(row[0], row[1], row[2], row[3]))

        print("Affichage de la table Electricite (Treeview) crée dans la vue Electricite")

5 réponses

Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 18 févr. 2022 à 18:38
Bonjour,
On ne voit pas tout le code
As-tu bien défini le cursor comme ici mais avec un autre nom que cursor puisque c'est déjà le nom de l'objet Python:
import sqlite3

connexion = sqlite3.connect(database)
curs =connexion.cursor()
curs.execute('"SELECT * FROM Electricite"')
0
Bonjour,
Merci pour ta réponse.

Le code complet est le suivant:

import sqlite3
import tkinter
import tkinter as tk
from tkinter import *
from tkinter import messagebox, ttk
from tkinter.ttk import Treeview


from mysql.connector import cursor, connection
from tkcalendar import DateEntry


# Creation de la fenetre principale avec  sa barre de menu
def create_main_window():
    main = tk.Tk()
    main.title("Gestion appartement")
    main.geometry("1200x1000")
    print("fenetre principale créée")

    main.tk.call("source", "azure.tcl")
    main.tk.call("set_theme", "light")
    print("thème appliqué")

    # Creation de la barre de menu
    menubar = Menu(main)
    main.config(menu=menubar)

    # Ajouter le menu Fichier et son sous-menu "Exit" dans la barre de menu
    menufichier = Menu(menubar)
    menubar.add_cascade(label="Fichier", menu=menufichier)
    menufichier.add_cascade(label='Exit', command=main.destroy, )

    # Ajouter le menu "Affichage" dans la barre de menu
    menuaffichage = Menu(menubar)
    menubar.add_cascade(label="Affichage", menu=menuaffichage)

    # Ajouter Menu "Dépenses" avec ses sous-menus dans "menuaffichage"
    sub_menu = Menu(menuaffichage)
    sub_menu.add_command(label="Electricité", command=create_electricite_window)
    sub_menu.add_command(label="2")
    sub_menu.add_command(label="3")
    menuaffichage.add_cascade(label='Dépenses', menu=sub_menu)

    # Ajouter le menu "Recettes" dans "menuaffichage"
    menuaffichage.add_command(label='Recettes', command=main.destroy, )

    print("barre de menu créée")

    main.mainloop()


# Creation de la fenetre Electricite
def create_electricite_window(sum_elec=None, table_for_electricite_database=None):

    #Création du cadre de la vue electricité
    window_electricite = tkinter.Toplevel()
    window_electricite.title("Dépenses en électricité")
    window_electricite.geometry("1400x800")
    window_electricite.resizable(width=False, height=False)
    print("frame principal de la fenetre Electrixite crée")

    # Creation de la base de donnees principale pour enregistrer les donnéées
    def appartement_database():
        connection = sqlite3.connect("Appartement_database.db")
        print("Base de données principale Appartement connectée")

        curs = connection.cursor()
        curs.execute("SELECT * FROM Electricite")

        # creation de la table Electricite dans la base de données principale Appartement
        curs.execute(
            "CREATE TABLE IF NOT EXISTS Electricite (Id INTEGER PRIMARY KEY, date_facture_elec TEXT, "
            "montant_facture_elec TEXT, Ref_facture_elec TEXT)")
        print("Table Electricite créée ou connectée dans la base principale Appartement")

        # calcul des totaux annuels à partir des donnéees dans la table Electricté de la base données principale
        def sum_elec():
            find_sum_total_elec = "select sum(montant_facture_elec) from Electricite"
            curs.execute(find_sum_total_elec)
            total_elec = (curs.fetchone()[0])
            print("Total global: ", total_elec)

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2021"')
            total_elec_2021 = (curs.fetchone()[0])
            print('total 2021: ', str(total_elec_2021) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2022"')
            total_elec_2022 = (curs.fetchone()[0])
            print('total 2022: ', str(total_elec_2022) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2023"')
            total_elec_2023 = (curs.fetchone()[0])
            print('total 2023: ', str(total_elec_2023) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2024"')
            total_elec_2024 = (curs.fetchone()[0])
            print('total 2024: ', str(total_elec_2024) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2025"')
            total_elec_2025 = (curs.fetchone()[0])
            print('total 2025: ', str(total_elec_2025) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2026"')
            total_elec_2026 = (curs.fetchone()[0])
            print('total 2026: ', str(total_elec_2026) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2027"')
            total_elec_2027 = (curs.fetchone()[0])
            print('total 2027: ', str(total_elec_2027) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2029"')
            total_elec_2028 = (curs.fetchone()[0])
            print('total 2028: ', str(total_elec_2028) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2029"')
            total_elec_2029 = (curs.fetchone()[0])
            print('total 2029: ', str(total_elec_2029) + " €")

            curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2030"')
            total_elec_2030 = (curs.fetchone()[0])
            print('total 2030: ', str(total_elec_2030) + " €")

            print("Calcul de totaux annuels réalisé")

        sum_elec()

    # Afficher dans la vue electricite les totaux annuels calculés
    def calc_total_annuel(total_elec_2021=None, total_elec_2022=None, total_elec_2023=None, total_elec_2024=None,
                          total_elec_2025=None, total_elec_2026=None, total_elec_2027=None, total_elec_2028=None,
                          total_elec_2029=None, total_elec_2030=None):

        # création du frame pour accueillir les totaux annuels
        frame3 = ttk.LabelFrame(window_electricite, text="Total annuel", width=200, height=280)
        frame3.place(x=810, y=16)
        print("Frame crée dans la fenetre Electricite pour accueillir les totaux annuels")

        # création des labels avec les totaux annuels
        label_total_elec_2021 = Label(window_electricite, text="Montant total 2021: " + str(total_elec_2021) + " €")
        label_total_elec_2021.place(x=825, y=38)
        label_total_elec_2022 = Label(window_electricite, text="Montant total 2022: " + str(total_elec_2022) + " €")
        label_total_elec_2022.place(x=825, y=58)
        label_total_elec_2023 = Label(window_electricite, text="Montant total 2023: " + str(total_elec_2023) + " €")
        label_total_elec_2023.place(x=825, y=78)
        label_total_elec_2024 = Label(window_electricite, text="Montant total 2024: " + str(total_elec_2024) + " €")
        label_total_elec_2024.place(x=825, y=98)
        label_total_elec_2025 = Label(window_electricite, text="Montant total 2025: " + str(total_elec_2025) + " €")
        label_total_elec_2025.place(x=825, y=118)
        label_total_elec_2026 = Label(window_electricite, text="Montant total 2026: " + str(total_elec_2026) + " €")
        label_total_elec_2026.place(x=825, y=138)
        label_total_elec_2027 = Label(window_electricite, text="Montant total 2027: " + str(total_elec_2027) + " €")
        label_total_elec_2027.place(x=825, y=158)
        label_total_elec_2028 = Label(window_electricite, text="Montant total 2028: " + str(total_elec_2028) + " €")
        label_total_elec_2028.place(x=825, y=178)
        label_total_elec_2029 = Label(window_electricite, text="Montant total 2029: " + str(total_elec_2029) + " €")
        label_total_elec_2029.place(x=825, y=198)
        label_total_elec_2030 = Label(window_electricite, text="Montant total 2030: " + str(total_elec_2030) + " €")
        label_total_elec_2030.place(x=825, y=218)
        print("totaux annuels affichés dans la vue Electricite")

    #  appel de fonctions
    appartement_database()
    calc_total_annuel()

    frame1 = ttk.LabelFrame(window_electricite, text="Electricité", width=370, height=280)
    frame1.place(x=15, y=16)
    print("Frame crée dans la fenetre Electricite pour accueillir les boutons et les entrées")

    # frame2 dans la fonction "delete_data_in_elec_table()"

    # entree de la date de facture electricite
    label_date_facture_elec = Label(window_electricite, text="Date de la facture")
    label_date_facture_elec.place(x=30, y=50)
    entry_date_facture_elec = DateEntry(window_electricite, date_pattern='dd/mm/y')
    entry_date_facture_elec.place(x=140, y=50)
    print("champs d'entrée de la date de la facture electricité crée")

    # entree du  montant de la facture electricite
    label_montant_facture_elec = Label(window_electricite, text="Montant facture")
    label_montant_facture_elec.place(x=30, y=90)
    entry_montant_facture_elec = Entry(window_electricite, width=30)
    entry_montant_facture_elec.focus()
    entry_montant_facture_elec.place(x=140, y=90)
    print("champs d'entrée du montant de la facture electricité crée")

    # entree reference facture electricite
    label_reference_facture_elec = Label(window_electricite, text="Référence facture")
    label_reference_facture_elec.place(x=30, y=130)
    entry_reference_facture_elec = Entry(window_electricite, width=30)
    entry_reference_facture_elec.place(x=140, y=130)
    print("champs d'entrée de la référence de la facture electricité crée")

    # Ajouter des données dans la table Electricite de la base de donnees Appartement
    def add_data_in_elec_table(entry_date_facture_elec=None, entry_montant_facture_elec=None,
                               entry_reference_facture_elec=None, tree_elec=None):
        # definition de variables
        date_facture_elec = entry_date_facture_elec.get()
        montant_facture_elec = entry_montant_facture_elec.get()
        reference_facture_elec = entry_reference_facture_elec.get()

        curs.execute("INSERT INTO Electricite (date_facture_elec, montant_facture_elec, Ref_facture_elec)"
                       "VALUES(?,?,?)", (date_facture_elec, montant_facture_elec, reference_facture_elec))
        connection.commit()

        for item in tree_elec.get_children(): tree_elec.delete(item)
        curs.execute("SELECT * FROM Electricite")
        result_elec = curs.fetchall()
        for row in result_elec:
            tree_elec.insert('', 'end', values=(row[0], row[1], row[2], row[3]))
        entry_montant_facture_elec.delete(0, END)  # vider le champs Montant après avoir cliqué sur Ajouter et complété la base de données
        entry_reference_facture_elec.delete(0, END) # vider le champs Référence après avoir cliqué sur Ajouter et complété la base de données
        sum_elec()  # recalculer la somme totale

    # bouton "Ajouter"
    bouton1 = ttk.Button(window_electricite, text="Ajouter", command=add_data_in_elec_table)
    bouton1.place(x=30, y=180)
    print("bouton Ajouter crée")

    # création du treeview pour afficher les donnéées de la table Electricite dans la base de données principale
    def treeview_for_electricite_database(curs=None):
        tree_elec = Treeview(window_electricite, columns=("Id", "Date", "Montant", "Référence"), show="headings")
        tree_elec.heading('Id', text="Id")
        tree_elec.heading('Date', text="Date")
        tree_elec.heading('Montant', text="Montant")
        tree_elec.heading('Référence', text="Référence")
        tree_elec.column("Id", anchor=CENTER, width=20)
        tree_elec.column("Date", anchor=CENTER, width=70)
        tree_elec.column("Montant", anchor=CENTER, width=70)
        tree_elec.column("Référence", anchor=CENTER, width=70)
        tree_elec.place(x=420, y=25)

        curs.execute("SELECT * FROM Electricite")
        result_elec = curs.fetchall()
        for row in result_elec:
            tree_elec.insert('', 'end', values=(row[0], row[1], row[2], row[3]))

        print("Affichage de la table Electricite (Treeview) crée dans la vue Electricite")

    treeview_for_electricite_database()

    # Supprimer des donnees dans la table Electricite de la base de donnees Appartement
    def delete_data_in_elec_table(tree_elec=None, window_electricite=None, curs=None):
        if not tree_elec.selection():  # Teste si une ligne a été sélectionnée avant d'exécuter l'instruction SQL Delete
            frame2 = Label(window_electricite, text="Veuillez sélectionner une ligne", fg="#F00020", font="Arial 12")
            frame2.place(x=85, y=270)
            frame2.after(3000, frame2.destroy)

        else:
            # result = messagebox.askquestion("Electricité", "Etes-vous sûr de vouloir supprimer cette facture",
            # icon="warning") if result == 'yes':
            iid = tree_elec.focus()  # Obtient l'iid de la ligne sélectionnée et qui a le focus
            sup_row = tree_elec.set(iid, "Id")
            tree_elec.delete(iid)
            curs.execute("DELETE FROM Electricite WHERE Id = ?", (sup_row,))
            frame2 = Label(window_electricite, text="Facture supprimée", fg="#F00020", font="Arial 12")
            frame2.place(x=125, y=270)
            frame2.after(3000, frame2.destroy)  # effacer le message après 3000 ms
            sum_elec()  # recalculer la somme totale

    # bouton "Supprimer"
    bouton2 = ttk.Button(window_electricite, text="Supprimer", command=delete_data_in_elec_table)
    bouton2.place(x=132, y=180)
    print("bouton Supprimer crée")

    # bouton "Modifier"
    bouton3 = ttk.Button(window_electricite, text="Modifier")
    bouton3.place(x=235, y=180)
    print("bouton Modifier crée")


    def close_window_electricite(window_electricite=None):
        window_electricite.destroy()

    bouton4 = ttk.Button(window_electricite, text="Quitter", command=close_window_electricite)
    bouton4.place(x=30, y=220)
    print("bouton Quitter crée")


create_main_window()
0