01-B-TD03_0 : INTRODUCTION

Truc & astuceEtapes

1. Connexion à la base de données :

  • Le code commence par établir une connexion à la base de données SQLite spécifiée dans `pathBDD` en utilisant `sqlite3.connect(pathBDD)`.

2. Création du curseur :

  • Ensuite, un objet curseur est créé à partir de la connexion à la base de données en utilisant `conn.cursor()`. Ce curseur sera utilisé pour exécuter des commandes SQL.

3. Exécution de la création de la table :

  • Une commande SQL est exécutée via le curseur pour créer une table nommée 'competences' avec les colonnes spécifiées (id, code, name, validation) et leurs attributs respectifs (type et contraintes).

4. Validation et Commit :

  • La connexion à la base de données est validée en exécutant `conn.commit()`. Cela valide les changements effectués par la commande SQL et les enregistre de manière permanente dans la base de données.

4. Gestion des erreurs :

  • Le bloc `except` capture les erreurs de type `sqlite3.Error`, et en cas d'erreur, affiche un message d'erreur spécifique.

5. Fermeture de la connexion :

  • Dans le bloc `finally`, la connexion à la base de données est fermée en utilisant `conn.close()`. Cela assure une bonne gestion des ressources et libère la connexion à la base de données une fois les opérations terminées.

Créer une base de données SQLite avec une requête SQL

1
def execute_sql_creation_table_competences(pathBDD):
2
    try:
3
        conn = sqlite3.connect(pathBDD)
4
        cursor = conn.cursor()
5
        cursor.execute("""
6
            CREATE TABLE IF NOT EXISTS competences (
7
            id INTEGER PRIMARY KEY NOT NULL,
8
            code TEXT NOT NULL UNIQUE,
9
            name TEXT NOT NULL UNIQUE,
10
            validation TEXT)
11
            """)
12
        conn.commit()
13
        print("Le fichier SQL a été exécuté avec succès.")
14
15
    except sqlite3.Error as error:
16
        print("Erreur lors de l'exécution du fichier SQL :", error)
17
    finally:
18
        # Fermeture du fichier SQL (non proposé par l'IA)
19
        conn.close()

Préparation des données

6. Lecteur Fichier Excel

On lit le fichier Excel généré à l'étape TD_02_A3, et on récupère les données dans un objet dataframe.

7. Dans une boucle for, on parcours les lignes de la dataframe afin d'extraire pour chaque compétence les 4 données qui nous intéressent (id, code, name, validation)

8. On prépare la requête SQL d'insertion en y intégrant les 4 données.

Test étapes 6 et 7 seuls

1
# TD_03_0b_base : Code lecture excel
2
pathfileexcel="D:\\SRP\\EDC-01_NOTES\\TD\\test_TD_02_A3_1_pandas.xlsx"
3
4
# 6.
5
df = pd.read_excel(pathfileexcel, sheet_name='competences')
6
# avec _, on n'évite l'index du n° de ligne de la dataframe, et on récupère uniquement les données de chaque colonne des lignes    
7
# 7. Boucle sur chaque ligne (ici, on aura 5 itérations)
8
for _, row in df.iterrows():
9
    # 1. on extrait la valeur de chaque colonne de la ligne
10
    id = row['id']
11
    code =row['code']
12
    name = row['name']
13
    # avec SQLite, le type de données booléen n'existe pas, il faut convertir en chaîne
14
    validation = f"{row['validation']}"

Etape 8

A ajouter dans la boucle au même niveau (ou à la place) que la ligne qui contient print. On pourrait penser que la syntaxe est lourde avec les ?. En fait, cela permet d'éviter la construction d'une chaîne plus complexe à construire en intercalant les valeurs des variables id, code, name, validation dans l'instruction SQL complète.

1
# 8.
2
cursor.execute("INSERT INTO competences (id, code, name, validation) VALUES (?, ?, ?, ?)", (id, code, name, validation))

ExempleCode complet

1
# TD_03_0d.py = étape a et b avec étape c à l'intérieur de la boucle
2
import sqlite3
3
import pandas as pd
4
5
cheminBDD="TD_03_0a.db"
6
try:
7
    # 1.
8
    conn = sqlite3.connect(cheminBDD)
9
    # 2.
10
    cursor = conn.cursor()
11
    # 3.
12
    cursor.execute("""
13
        CREATE TABLE IF NOT EXISTS competences (
14
        id INTEGER PRIMARY KEY NOT NULL,
15
        code TEXT NOT NULL UNIQUE,
16
        name TEXT NOT NULL UNIQUE,
17
        validation TEXT)
18
        """)
19
    #4
20
    conn.commit()
21
    print("La base à été créée.")
22
23
except sqlite3.Error as error:
24
    # 4.
25
    print("Erreur lors de l'exécution :", error)
26
finally:
27
    # 5.
28
    conn.close()
29
    
30
# 1.
31
conn = sqlite3.connect(cheminBDD)
32
# 2.
33
cursor = conn.cursor()
34
# A l'issue de l'étape TD_02_A3_1_pandas.py, on a généré un fichier Excel contenant les données de la table compétences
35
36
pathfileexcel="D:\\SRP\\EDC-01_NOTES\\TD\\test_TD_02_A3_1_pandas.xlsx"
37
38
# 6.
39
df = pd.read_excel(pathfileexcel, sheet_name='competences')
40
# avec _, on n'évite l'index du n° de ligne de la dataframe, et on récupère uniquement les données de chaque colonne des lignes    
41
# 7. Boucle sur chaque ligne (ici, on aura 5 itérations)
42
for _, row in df.iterrows():
43
    # 1. on extrait la valeur de chaque colonne de la ligne
44
    id = row['id']
45
    code =row['code']
46
    name = row['name']
47
    # avec SQLite, le type de données booléen n'existe pas, il faut convertir en chaîne
48
    validation = f"{row['validation']}"
49
    #7. Analyse de la ligne
50
    if code is None :
51
        code = f"C{id}"
52
    if name is None :
53
        name = code
54
    if validation is None:
55
        validation ="Non évalué"    
56
    try:
57
        # 8.
58
        cursor.execute("INSERT INTO competences (id, code, name, validation) VALUES (?, ?, ?, ?)", (id, code, name, validation))
59
    except Exception as e:
60
        print(f"Erreur lors de l'insertion: {e}")
61
    
62
    # fin de la boucle
63
    
64
# on valide définitivement les modifications dans la base de données  	
65
conn.commit()
66
# on ferme la connection    
67
conn.close()