Phase 03_A
03A1 : insertion de tuples 1 par 1⚓
# TD_03_A1.py
import sqlite3
import os, subprocess
import pandas as pd
from unidecode import unidecode
import sqlite3
# Chemin du fichier de base de données
cheminBDD = 'TD_03_A1.db'
# Vérifier si le fichier de base de données existe et le supprimer
if os.path.exists(cheminBDD):
os.remove(cheminBDD)
print(f"Fichier de base de données '{cheminBDD}' supprimé.")
# a1 : Connexion à la base de données
conn = sqlite3.connect(cheminBDD)
# a2 : Création d'un curseur
cur = conn.cursor()
# b : Création de la table competences
cur.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 table
cur.execute('''
INSERT INTO competences (code, name, validation)
VALUES (?, ?, ?)
''', ('MAI', 'MAINTENIR', 'NON EVALUE'))
# Validation des changements
conn.commit()
# c2 : Insertion d'un autre tuple dans la table
cur.execute('''
INSERT INTO competences (code, name, validation)
VALUES (?, ?, ?)
''', ('AME','AMELIORER','NON EVALUE'))
conn.commit()
# Fermeture du curseur et de la connexion
cur.close()
# d : vérifier au prélable le chemin permettant d'atteindre DB Browser
db_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érer
competences_data = [
('MAI', 'MAINTENIR', 'NON EVALUE'),
('AME', 'AMELIORER', 'NON EVALUE'),
# Ajoutez d'autres tuples si nécessaire
]
# c2 Insertion en une seule opération
cur.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 table
foreach ($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 SQLite
let 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étence
function 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étence
function 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étence
ajouterCompetence('C002', 'NOUVELLE COMPETENCE', 'NON EVALUE');
// Exemple de modification d'une compétence
modifierCompetence(1, 'COMPETENCE MODIFIEE', 'EVALUÉE');
// Fermeture de la connexion à la base de données
db.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,