01-B-TD03_0 : INTRODUCTION
Réglementaire : Pré-requis⚓
Suivre la procédure 39 : avec la base de données existante bdnotes.db, vous avez, dans la procédure 38, mis en oeuvre quelques requêtes SQL, ici, nous allons créer les données (Table et Tuples de la table compétences) en langage python et alimenter une base de données. Le fichier Excel TD_02.xlsx
servira de base pour alimenter la table.
Truc & astuce : Etapes⚓
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⚓
def execute_sql_creation_table_competences(pathBDD):
try:
conn = sqlite3.connect(pathBDD)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS competences (
id INTEGER PRIMARY KEY NOT NULL,
code TEXT NOT NULL UNIQUE,
name TEXT NOT NULL UNIQUE,
validation TEXT)
""")
conn.commit()
print("Le fichier SQL a été exécuté avec succès.")
except sqlite3.Error as error:
print("Erreur lors de l'exécution du fichier SQL :", error)
finally:
# Fermeture du fichier SQL (non proposé par l'IA)
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⚓
# TD_03_0b_base : Code lecture excel
pathfileexcel="D:\\SRP\\EDC-01_NOTES\\TD\\test_TD_02_A3_1_pandas.xlsx"
# 6.
df = pd.read_excel(pathfileexcel, sheet_name='competences')
# 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. Boucle sur chaque ligne (ici, on aura 5 itérations)
for _, row in df.iterrows():
# 1. on extrait la valeur de chaque colonne de la ligne
id = row['id']
code =row['code']
name = row['name']
# avec SQLite, le type de données booléen n'existe pas, il faut convertir en chaîne
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.
# 8.
cursor.execute("INSERT INTO competences (id, code, name, validation) VALUES (?, ?, ?, ?)", (id, code, name, validation))
Exemple : Code complet⚓
# TD_03_0d.py = étape a et b avec étape c à l'intérieur de la boucle
import sqlite3
import pandas as pd
cheminBDD="TD_03_0a.db"
try:
# 1.
conn = sqlite3.connect(cheminBDD)
# 2.
cursor = conn.cursor()
# 3.
cursor.execute("""
CREATE TABLE IF NOT EXISTS competences (
id INTEGER PRIMARY KEY NOT NULL,
code TEXT NOT NULL UNIQUE,
name TEXT NOT NULL UNIQUE,
validation TEXT)
""")
#4
conn.commit()
print("La base à été créée.")
except sqlite3.Error as error:
# 4.
print("Erreur lors de l'exécution :", error)
finally:
# 5.
conn.close()
# 1.
conn = sqlite3.connect(cheminBDD)
# 2.
cursor = conn.cursor()
# 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
pathfileexcel="D:\\SRP\\EDC-01_NOTES\\TD\\test_TD_02_A3_1_pandas.xlsx"
# 6.
df = pd.read_excel(pathfileexcel, sheet_name='competences')
# 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. Boucle sur chaque ligne (ici, on aura 5 itérations)
for _, row in df.iterrows():
# 1. on extrait la valeur de chaque colonne de la ligne
id = row['id']
code =row['code']
name = row['name']
# avec SQLite, le type de données booléen n'existe pas, il faut convertir en chaîne
validation = f"{row['validation']}"
#7. Analyse de la ligne
if code is None :
code = f"C{id}"
if name is None :
name = code
if validation is None:
validation ="Non évalué"
try:
# 8.
cursor.execute("INSERT INTO competences (id, code, name, validation) VALUES (?, ?, ?, ?)", (id, code, name, validation))
except Exception as e:
print(f"Erreur lors de l'insertion: {e}")
# fin de la boucle
# on valide définitivement les modifications dans la base de données
conn.commit()
# on ferme la connection
conn.close()