Phase 03_A
03A1 : insertion de tuples 1 par 1⚓
# TD_03_A1.pyimport sqlite3
import os, subprocess
import pandas as pd
from unidecode import unidecode
import sqlite3
# Chemin du fichier de base de donnéescheminBDD = 'TD_03_A1.db'
# Vérifier si le fichier de base de données existe et le supprimerif os.path.exists(cheminBDD):
os.remove(cheminBDD)
print(f"Fichier de base de données '{cheminBDD}' supprimé.")
# a1 : Connexion à la base de donnéesconn = sqlite3.connect(cheminBDD)
# a2 : Création d'un curseurcur = conn.cursor()
# b : Création de la table competencescur.execute('''
CREATE TABLE IF NOT EXISTS competences ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL, name TEXT NOT NULL, validation TEXT NOT NULL)''')# c1 : Insertion d'un tuple dans la tablecur.execute('''
INSERT INTO competences (code, name, validation) VALUES (?, ?, ?)''', ('MAI', 'MAINTENIR', 'NON EVALUE'))
# Validation des changementsconn.commit()
# c2 : Insertion d'un autre tuple dans la tablecur.execute('''
INSERT INTO competences (code, name, validation) VALUES (?, ?, ?)''', ('AME','AMELIORER','NON EVALUE'))
conn.commit()
# Fermeture du curseur et de la connexioncur.close()
# d : vérifier au prélable le chemin permettant d'atteindre DB Browserdb_browser_path = r"C:\Program Files (x86)\DB Browser for SQLite\DB Browser for SQLite.exe"
print(db_browser_path)
if os.path.exists(db_browser_path) and os.path.exists(cheminBDD):
try:subprocess.run([db_browser_path, cheminBDD], check=True)
except subprocess.CalledProcessError as e:
print(f"Erreur lors de l'exécution : {e}")
else:print("L'un des fichiers spécifiés n'existe pas.")
03A2 : insertion multiple de tuples⚓
# c1 : Liste des tuples à insérercompetences_data = [
('MAI', 'MAINTENIR', 'NON EVALUE'),
('AME', 'AMELIORER', 'NON EVALUE'),
# Ajoutez d'autres tuples si nécessaire]
# c2 Insertion en une seule opérationcur.executemany('''
INSERT INTO competences (code, name, validation) VALUES (?, ?, ?)''', competences_data)
Remarque : SQL intégré dans le code Python⚓
SQL n'est pas à proprement parler un langage, mais un dialecte. Il peut donc être incorporé dans des variables de type chaîne et ses requêtes sont ainsi passées comme paramètres de méthodes/procédures au connecteur python sqlite3. Quand la partie SQL reste indépendante de variables/données python, c'est aussi simple que la création de la base avec CREATE TABLE ..... en mode SQL.
Par contre, si le nom de la table et des champs/attributs se trouvent dans des variables python, la requête devient dynamique, et il faut construire la chaîne complète de la directive SQL. C'est l'intérêt d'utiliser un langage de programmation afin de changer dynamiquement des paramètres de requêtes, comme les commandes d'un client pour site web commercial, la nomenclature des pièces (uniquement les capteurs) d'un équipement, etc ...
On retrouve cette même logique dans la rédaction de page web avec du html qui intègre des scripts en php ou javascript. Ou encore des pages php ou javascript qui incorporent les basiles html dans les traitements effectués par ces langages.
Exemple : PHP côté serveur⚓
Ci-dessous, le même cas traité en PHP du côté du serveur.
<?php
// Création ou connexion à la base de données SQLite$db = new SQLite3('TD_03_A1.db');
// Création de la table competences$db->exec('
CREATE TABLE IF NOT EXISTS competences ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL, name TEXT NOT NULL, validation TEXT NOT NULL)');// Insertion d'un tuple dans la table$statment = $db->prepare('INSERT INTO competences (code, name, validation) VALUES (:code, :name, :validation)');
// Liste des compétences à insérer$competences_data = [
['MAI', 'MAINTENIR', 'NON EVALUE'],
['AME', 'AMELIORER', 'NON EVALUE'],
];
// Insertion des tuples dans la tableforeach ($competences_data as $competence) {
$statment->bindValue(':code', $competence[0], SQLITE3_TEXT);
$statment->bindValue(':name', $competence[1], SQLITE3_TEXT);
$statment->bindValue(':validation', $competence[2], SQLITE3_TEXT);
$statment->execute();
}
// Fermeture de la connexion à la base de données$db->close();
echo "Table créée et tuples insérés avec succès.";
?>Exemple : Javascript côté serveur avec un serveur node.js⚓
Ci-dessous, le même cas traité en javascript du côté du serveur.
const sqlite3 = require('sqlite3').verbose();
// Connexion à la base de données SQLitelet db = new sqlite3.Database('TD_03_A1.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connecté à la base de données SQlite.');
});
// Fonction pour ajouter une compétencefunction ajouterCompetence(code, name, validation) {
const sql = 'INSERT INTO competences (code, name, validation) VALUES (?, ?, ?)';
db.run(sql, [code, name, validation], function(err) {
if (err) {
console.error(err.message);
}
console.log(`Compétence ajoutée avec l'ID ${this.lastID}`);
});
}
// Fonction pour modifier une compétencefunction modifierCompetence(id, newName, newValidation) {
const sql = 'UPDATE competences SET name = ?, validation = ? WHERE id = ?';
db.run(sql, [newName, newValidation, id], function(err) {
if (err) {
console.error(err.message);
}
console.log(`Compétence avec l'ID ${id} modifiée.`);
});
}
// Exemple d'ajout d'une compétenceajouterCompetence('C002', 'NOUVELLE COMPETENCE', 'NON EVALUE');
// Exemple de modification d'une compétencemodifierCompetence(1, 'COMPETENCE MODIFIEE', 'EVALUÉE');
// Fermeture de la connexion à la base de donnéesdb.close((err) => {
if (err) {
console.error(err.message);
}
console.log('Connexion à la base de données fermée.');
});
Réglementaire : Analyse du code⚓
On voit apparaître le besoin de ne pas répéter sans cesse les mêmes portions de programmes : proposez ce qui pourrait être placé dans des procédures de façon à simplifier le code du programme principal. Certaines pourraient être réutilisées pour la gestion d'autres tables comme la table promotions,