Table of Contents

  • 1  Tester des contraintes d'intégrité
    • 1.1  Création de la base de données en mémoire
    • 1.2  Test de requêtes
    • 1.3  Test des contraintes d'intégrité
    • 1.4  Exercice : transformer la base
    • 1.5  Fermeture de la base

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 [ ]: