nsi:projets:sql
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:projets:sql [2021/10/22 23:35] – ↷ Page déplacée de nsi:tds:serveur_web20:nsi:projets:sql à nsi:projets:sql goupillwiki | nsi:projets:sql [2022/10/18 09:57] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Projet SQL et Python ====== | ====== Projet SQL et Python ====== | ||
| - | <wrap todo>En travaux</wrap> | + | On souhaite développer une application de gestion d'une base de données. |
| + | |||
| + | Vous êtes libre du contenu de la BDD. Par exemple : | ||
| + | * élèves d'un lycée, | ||
| + | * site marchand, | ||
| + | * déroulement du championnat de ligue 1 de football, | ||
| + | * banque de données sur des jeux vidéos, | ||
| + | * etc. | ||
| + | |||
| + | ===== Votre travail ===== | ||
| + | |||
| + | - Vous devez définir votre base de données, | ||
| + | * en donnant le diagramme entité - association | ||
| + | * en donnant les requêtes SQL permettant de créer la base vide. | ||
| + | - Vous devez créer une interface simple permettant de manipuler le contenu de la BDD : | ||
| + | * ajouter des items, | ||
| + | * consulter le contenu | ||
| + | * naviguer d'un item à l' | ||
| + | |||
| + | <WRAP important>Votre application doit pouvoir être utilisée par un non informaticien : L' | ||
| + | |||
| + | ===== Exemple ===== | ||
| + | |||
| + | Reprenons la base de données sur les films que nous avons déjà rencontrée. Soit le diagramme suivant : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | On sait déjà -- voir [[nsi: | ||
| + | |||
| + | <code sql linenums> | ||
| + | CREATE TABLE ARTISTE ( | ||
| + | idArtiste INTEGER PRIMARY KEY, | ||
| + | nom VARCHAR(20), | ||
| + | prénom VARCHAR(20), | ||
| + | biographie TEXT, | ||
| + | naissance DATE | ||
| + | ); | ||
| + | |||
| + | CREATE TABLE FILM ( | ||
| + | idFilm INTEGER PRIMARY KEY, | ||
| + | titreVO VARCHAR(40), | ||
| + | titreVF VARCHAR(40), | ||
| + | année INTEGER, | ||
| + | idReal INTEGER NOT NULL, | ||
| + | FOREIGN KEY(idReal) REFERENCES ARTISTE(idArtiste) | ||
| + | ); | ||
| + | |||
| + | CREATE TABLE JOUEDANS ( | ||
| + | idArtiste INTEGER NOT NULL, | ||
| + | idFilm INTEGER NOT NULL, | ||
| + | rôle VARCHAR(20), | ||
| + | PRIMARY KEY (idArtiste, idFilm), | ||
| + | FOREIGN KEY(idArtiste) REFERENCES ARTISTE(idArtiste), | ||
| + | FOREIGN KEY(idFilm) REFERENCES FILM(idFilm) | ||
| + | ); | ||
| + | </ | ||
| + | |||
| + | <WRAP tip>Vous êtes libre d' | ||
| + | |||
| + | Supposons que nous avons créé la base {{ : | ||
| + | |||
| + | Votre application, | ||
| + | |||
| + | <WRAP tip>Je présente un exemple très simple en mode texte. Vous êtes libres de prévoir plus compliqué, par exemple avec [[nsi: | ||
| + | </ | ||
| + | |||
| + | Je propose une interface en mode texte. | ||
| + | |||
| + | === Écran d' | ||
| + | |||
| + | Lors du démarrage de l' | ||
| + | |||
| + | <code lang-none> | ||
| + | 1. Ajouter un artiste | ||
| + | 2. Ajouter un film | ||
| + | 3. Voir les artistes | ||
| + | 4. Voir les films | ||
| + | 5. Quitter | ||
| + | Entrez une réponse. | ||
| + | </ | ||
| + | |||
| + | === Ajout d' | ||
| + | |||
| + | Si on sélectionne "1. Ajouter un artiste" | ||
| + | |||
| + | <code lang-none> | ||
| + | Entrez un nom : | ||
| + | |||
| + | Entrez un prénom : | ||
| + | |||
| + | Entrez une biographie : | ||
| + | |||
| + | Entrée une date de naissance : | ||
| + | </ | ||
| + | |||
| + | <WRAP tip>Si vous souhaitez que la biographie contienne des retours lignes, il faudra réfléchir à une interface adéquat. Il faudra aussi tenir compte du format particulier des dates.</ | ||
| + | |||
| + | === Ajout de film === | ||
| + | |||
| + | Si on sélectionne "2. Ajouter un film" on obtient la série de questions : | ||
| + | |||
| + | <code lang-none> | ||
| + | Entrez un titre VO : | ||
| + | |||
| + | Entrez un titre VF : | ||
| + | |||
| + | Entrez une année : | ||
| + | </ | ||
| + | |||
| + | Puis il faudrait prévoir une liste des artistes afin de pouvoir en sélectionner un comme réalisateur. Cette interface pourrait ressembler à ce qui va suivre pour l' | ||
| + | |||
| + | === Affichage des artistes === | ||
| + | |||
| + | <code lang-none> | ||
| + | 1. Brice Willis | ||
| + | 2. John McTiernan | ||
| + | 3. Alan Rickman | ||
| + | 4. Bonnie Bedelia | ||
| + | 5. Terry Gilliam | ||
| + | 6. Madeleine Stowe | ||
| + | 7. Christopher Plummer | ||
| + | 8. Brad Pitt | ||
| + | 9. Quentin Tarantino | ||
| + | P. Précédent | ||
| + | S. Suivant | ||
| + | R. Abandon - Retour menu | ||
| + | |||
| + | Entrez votre choix : | ||
| + | </ | ||
| + | |||
| + | Le menu est assez clair pour se passer de commentaires. Ce menu pourrait servir à sélectionner un artiste lors de la création d'un film et il sert bien-sûr à atteindre la fiche de chaque artiste. | ||
| + | |||
| + | === Affichage artiste === | ||
| + | |||
| + | Si on a demander à voir un artiste, on obtient une fiche comme : | ||
| + | |||
| + | <code lang-none> | ||
| + | Bruce Willis - Né le 19/ | ||
| + | ------------ | ||
| + | Né sur une base américaine à Idar-Oberstein en Allemagne de l' | ||
| + | |||
| + | Rôles | ||
| + | ----- | ||
| + | 1. John Mc Lain dans Piège de Cristal | ||
| + | 2. James Cole dans L' | ||
| + | 8. Butch Coolidge dans Pulp Fiction | ||
| + | |||
| + | Action | ||
| + | ------ | ||
| + | Entrez un nombre pour voir le film | ||
| + | A pour ajouter un rôle | ||
| + | R pour retour menu principal | ||
| + | SupRole | ||
| + | SupArtiste pour supprimer l' | ||
| + | </ | ||
| + | |||
| + | === Etc. === | ||
| + | |||
| + | Je vous laisse imaginer les autres menus utiles. | ||
| + | |||
| + | Comme déjà dit c'est un travail répétitif et il faut bien vous organiser pour ne pas perdre du temps à réécrire 2x le même code. | ||
| + | |||
| + | ===== Aide pour organiser votre code ===== | ||
| + | |||
| + | Vous avez intérêt à bien séparer la partie SQL de l' | ||
| + | |||
| + | ==== Exemple de ce qu'il ne faut pas faire ==== | ||
| + | |||
| + | Supposons que je travaille sur la base des films et que je veux gérer l' | ||
| + | |||
| + | <code python> | ||
| + | import sqlite3 | ||
| + | |||
| + | # variables globales | ||
| + | c = sqlite3.connect(" | ||
| + | c.execute(" | ||
| + | |||
| + | def ajout_artiste(): | ||
| + | prenom = input(" | ||
| + | nom = input(" | ||
| + | naissance = input(" | ||
| + | bio = input(" | ||
| + | cursor = c.cursor() | ||
| + | data = (prenom, nom, biographie, naissance) | ||
| + | cursor.execute(" | ||
| + | </ | ||
| + | |||
| + | Ce code mélange l' | ||
| + | |||
| + | ==== Ce qu'il vaut mieux faire ==== | ||
| + | |||
| + | Il est beaucoup mieux de placer le SQL dans un module à part. On pourrait faire ceci : | ||
| + | |||
| + | <code python> | ||
| + | # fichier sql.py, compris par Python comme le module sql | ||
| + | import sqlite3 | ||
| + | |||
| + | # variables globales | ||
| + | c = sqlite3.connect(" | ||
| + | c.execute(" | ||
| + | |||
| + | def ajout_artiste(prenom, | ||
| + | cursor = c.cursor() | ||
| + | data = (prenom, nom, biographie, naissance) | ||
| + | cursor.execute(" | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # module principal | ||
| + | import sql | ||
| + | |||
| + | def ajout_artiste(): | ||
| + | prenom = input(" | ||
| + | nom = input(" | ||
| + | naissance = input(" | ||
| + | bio = input(" | ||
| + | sql.ajout_artiste(prenom, | ||
| + | </ | ||
| + | |||
| + | Remarquez qu'on utilise la notation avec le point pour signifier que '' | ||
| + | |||
| + | Vous avez intérêt, dès que votre application prend du volume, à en distribuer les parties en autant de modules que possible afin de maintenir l' | ||
| + | |||
| + | ==== Encore mieux avec une classe ==== | ||
| + | |||
| + | C'est encore mieux si on emballe les fonctions sql dans une classe faite exprès. | ||
| + | |||
| + | <code python> | ||
| + | # fichier sql.py, compris par Python comme le module sql | ||
| + | import sqlite3 | ||
| + | |||
| + | class SQL: | ||
| + | def __init__(self): | ||
| + | self.c = sqlite3.connect(" | ||
| + | self.c.execute(" | ||
| + | |||
| + | def ajout_artiste(self, | ||
| + | cursor = c.cursor() | ||
| + | data = (prenom, nom, biographie, naissance) | ||
| + | cursor.execute(" | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # module principal | ||
| + | from sql import SQL | ||
| + | |||
| + | # au début on pense à créer : | ||
| + | db = SQL() # crée l' | ||
| + | |||
| + | def ajout_artiste(): | ||
| + | prenom = input(" | ||
| + | nom = input(" | ||
| + | naissance = input(" | ||
| + | bio = input(" | ||
| + | db.ajout_artiste(prenom, | ||
| + | </ | ||
| + | |||
| + | ==== Enrichir la classe ==== | ||
| + | |||
| + | La classe contient toutes les requêtes utiles. Supposez que vous ayez besoin d'une requête pour obtenir uniquement une liste de noms et prénoms d' | ||
| + | |||
| + | À la fin, il n'y a pas une seule requête SQL dans le fichier principal. | ||
| + | |||
| + | Exemple de classe : | ||
| + | |||
| + | <code python> | ||
| + | # module sql | ||
| + | |||
| + | import sqlite3 | ||
| + | |||
| + | class SQL: | ||
| + | def __init__(self): | ||
| + | self.c = sqlite3.connect(" | ||
| + | self.c.execute(" | ||
| + | self.__is_closed = False | ||
| + | |||
| + | def __init_db(self): | ||
| + | # crée les tables en cas de première utilisation | ||
| + | # suffit d' | ||
| + | # de sorte que si elles existent déjà, rien n'est fait | ||
| + | cursor = self.c | ||
| + | cursor.execute(" | ||
| + | |||
| + | # on peut ainsi créer les autres | ||
| + | |||
| + | def close(self): | ||
| + | # À appeler à la fermeture pour appliquer les modifs et libérer le fichier | ||
| + | self.c.commit() | ||
| + | self.c.close() | ||
| + | self.__is_closed = True | ||
| + | |||
| + | def ajout_artiste(self, | ||
| + | assert not self.__is_closed, | ||
| + | cursor = c.cursor() | ||
| + | data = (prenom, nom, biographie, naissance) | ||
| + | cursor.execute(" | ||
| + | |||
| + | def get_films_from_real(self, | ||
| + | # liste des films pour un réal donné | ||
| + | assert not self.__is_closed, | ||
| + | cursor = c.cursor() | ||
| + | cursor.execute(" | ||
| + | return cursor.fetchall() | ||
| + | </ | ||
| + | |||
| + | ==== Pousser plus loin ==== | ||
| + | |||
| + | Dès que l' | ||
| + | |||
| + | C'est plus compliqué alors pour cela j' | ||
| - | * Concevoir une base de données | ||
| - | * prévoir l' | ||
| - | Voir [[nsi: | ||
nsi/projets/sql.1634938529.txt.gz · Dernière modification : de goupillwiki
