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/25 16:49] – goupillwiki | nsi:projets:sql [2022/10/18 09:57] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 60: | Ligne 60: | ||
| <WRAP tip>Vous êtes libre d' | <WRAP tip>Vous êtes libre d' | ||
| - | Supposons que nous avons créé la base {{ : | + | Supposons que nous avons créé la base {{ : |
| Votre application, | Votre application, | ||
| Ligne 162: | Ligne 162: | ||
| 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. | 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' | ||
| + | |||
| + | |||
nsi/projets/sql.1635173347.txt.gz · Dernière modification : de goupillwiki
