Tester des contraintes d'intégrité
Création de la base de données en mémoire
In [ ]:
# coding: utf-8
import sqlite3 # module standard pour avoir une interface avec une base SQLite
connexion_vers_bdd = sqlite3.connect(":memory:")
# Création d'une connexion entre ce script Python et la base de données créée ici dans la RAM
# Cette base de données est effacée à la fin de la connexion
cur = connexion_vers_bdd.cursor() # On créé ainsi un curseur
# Le curseur créé exécute les requêtes SQL et récupère les résultats
cur.execute("PRAGMA foreign_keys = ON") # Active les clés étrangères
# création des tables nommées joueur et partie
# par exécution de plusieurs requêtes SQL :
cur.executescript("""
CREATE TABLE joueur (
idJoueur INT PRIMARY KEY,
nomJoueur VARCHAR(30) NOT nULL,
pnomJoueur VARCHAR(30) NOT NULL
);
CREATE TABLE partie(
idpartie INT PRIMARY KEY,
idJoueur1 INT REFERENCES joueur(idjoueur),
idJoueur2 INT REFERENCES joueur(idjoueur),
score1 INT NOT NULL,
score2 INT NOT NULL,
CHECK((idjoueur1 <>idjoueur2))
);
""")
connexion_vers_bdd.commit() # Valide et rend effectives les modifications "en attente",
# c'est-à-dire toutes les requêtes SQL des "execute" non encore validées.
# Ici, seulement la création de la table
# Alimentation de la base à partir dde deux listes de tuples.
# Chaque tuple correspond aux caractéristiques d'un joueur ou d'une partie :
data_joueur = [
(1,'Terez','Pascual'),
(2,'Melusine','Enfaillite'),
(3,'Leponge','Bob'),
(4,'Kalité','Filtre'),
(5,'Gosse','Bo')
]
data_partie = [
(1, 1, 2, 54, 45),
(2, 1, 3, 45, 85),
(3, 4, 5, 96, 35),
]
for donnees in data_joueur:
cur.execute(""" INSERT INTO joueur (idjoueur, nomJoueur, pnomJoueur)
VALUES(?, ?, ?)""", donnees)
# Ajout du joueur considéré lors du balayage
# Les ? sont des paramètres : sqlite3 les remplace par les valeurs du tuple considéré
connexion_vers_bdd.commit() # Validation et rend effectif l'ajout de
# tous les enregistrements précédents dans la table joueur
for donnees in data_partie:
cur.execute(""" INSERT INTO partie (idpartie, idjoueur1, idjoueur2, score1, score2)
VALUES(?, ?, ?, ?, ?)""", donnees)
# Ajout de la partie considéré lors du balayage
# Les ? sont des paramètres : sqlite3 les remplace par les valeurs du tuple considéré
connexion_vers_bdd.commit() # Validation et rend effectif l'ajout de
# tous les enregistrements précédents dans la table partie
Test de requêtes
In [ ]:
requete = " SELECT * FROM partie"
cur.execute(requete)
# Affichage des résultats
for element in cur :
print(element)
(1, 1, 2, 54, 45) (2, 1, 3, 45, 85) (3, 4, 5, 96, 35)
In [ ]:
In [ ]:
requete = " SELECT * FROM joueur"
cur.execute(requete)
# Affichage des résultats
for element in cur :
print(element)
(1, 'Terez', 'Pascual') (2, 'Melusine', 'Enfaillite') (3, 'Leponge', 'Bob') (4, 'Kalité', 'Filtre') (5, 'Gosse', 'Bo')
Test des contraintes d'intégrité
Observer toutes les contraintes d'intégrité et proposer des ordres (avec insert) qui contredisent ces contraintes.
In [ ]:
In [ ]:
In [ ]:
Exercice : transformer la base
Modifier la table 'Partie' pour insérer un attribut idvainqueur qui soit une clé étrangère reliée à l'attribut idjoueur de la table 'Joueur'
Modifier les données 'data_partie' pour prendre en compte ce nouvel attribut.
Fermeture de la base
In [ ]:
cur.close() # Libération du curseur : fin de l'interaction avec la Base SQLite
connexion_vers_bdd.close() # Fermeture de la connexion
# La base en mémoire vive devient inaccessible et sera détruite par le "ramasse-miette"
In [ ]: