« Programmation Python/Gestion d'une base de données » : différence entre les versions

Contenu supprimé Contenu ajouté
m ortho
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 53 :
Vous devez ensuite créer une instance (un objet) de la classe Gadfly :
 
<sourcesyntaxhighlight lang=python>
import gadfly
baseDonn = gadfly.gadfly()
</syntaxhighlight>
</source>
 
L'objet <code>baseDonn</code> ainsi créé est votre moteur de base de données local, lequel effectuera la plupart de ses opérations en mémoire vive. Ceci permet une exécution très rapide des requêtes.
Ligne 62 :
Pour créer la base de données proprement dite, il faut employer la méthode "startup" de cet objet :
 
<sourcesyntaxhighlight lang=python>
baseDonn.startup("mydata","E:/Python/essais/gadfly")
</syntaxhighlight>
</source>
 
Le premier paramètre transmis, <code>mydata</code>, est le nom choisi pour la base de données (vous pouvez évidemment choisir un autre nom !). Le second paramètre est le répertoire où l'on souhaite installer cette base de données. (Ce répertoire doit avoir été créé au préalable, et toute base de données de même nom qui préexisterait dans ce répertoire est écrasée sans avertissement).
Ligne 74 :
Afin de pouvoir transmettre vos requêtes SQL à l'objet <code>baseDonn</code> , vous devez cependant mettre en œuvre un ''curseur''. Il s'agit d'une sorte de tampon mémoire intermédiaire, destiné à mémoriser temporairement les données en cours de traitement, ainsi que les opérations que vous effectuez sur elles, avant leur transfert définitif dans de vrais fichiers. Cette technique permet donc d'annuler si nécessaire une ou plusieurs opérations qui se seraient révélées inadéquates (Vous pouvez en apprendre davantage sur ce concept en consultant l'un des nombreux manuels qui traitent du langage SQL). Veuillez à présent examiner le petit script ci-dessous, et noter que les requêtes SQL sont des chaînes de caractères, prises en charge par la méthode "execute" de l'objet ''curseur'' :
 
<sourcesyntaxhighlight lang=python>
cur = baseDonn.cursor()
cur.execute("create table membres (age integer, nom varchar, taille float)")
Ligne 81 :
cur.execute("Insert Into Membres(Age, Nom, Taille) Values (18,'Forcas',1.69)")
baseDonn.commit()
</syntaxhighlight>
</source>
 
La première des lignes ci-dessus crée l'objet curseur <code>cur</code>. Les chaînes de caractères comprises entre guillemets dans les 4 lignes suivantes contiennent des requêtes SQL très classiques. ''Notez bien que le langage SQL ne tient aucun compte de la casse des caractères'' : vous pouvez encoder vos requêtes SQL indifféremment en majuscules ou en minuscules (ce qui n'est pas le cas pour les instructions Python environnantes, bien entendu !)
Ligne 97 :
L'accès à une base de données existante ne nécessite que deux lignes de code :
 
<sourcesyntaxhighlight lang=python>
import gadfly
baseDonn = gadfly.gadfly("mydata","E:/Python/essais/gadfly")
</syntaxhighlight>
</source>
 
Ces deux lignes suffisent en effet pour transférer en mémoire vive les tables contenues dans les fichiers enregistrés sur disque. La base de données peut désormais être interrogée et modifiée :
 
<sourcesyntaxhighlight lang=python>
cur = baseDonn.cursor()
cur.execute("select * from membres")
print cur.pp()
</syntaxhighlight>
</source>
 
La première de ces trois lignes ouvre un curseur. La requête émise dans la seconde ligne demande la sélection d'un ensemble d'enregistrements, qui seront transférés de la base de données au curseur. Dans le cas présent, la sélection n'en n'est pas vraiment une : on y demande en effet d'extraire tous les enregistrements de la table membres (le symbole * est fréquemment utilisé en informatique avec la signification « tout » ou « tous »).
Ligne 116 :
Si vous préférez contrôler vous-même la mise en page des informations, il vous suffit d'utiliser à sa place la méthode <code>fetchall()</code>, laquelle renvoie une liste de tuples. Essayez par exemple :
 
<sourcesyntaxhighlight lang=python>
for x in cur.fetchall():
print x, x[0], x[1], x[2]
</syntaxhighlight>
</source>
 
Vous pouvez bien entendu ajouter des enregistrements supplémentaires :
 
<sourcesyntaxhighlight lang=python>
cur.execute("Insert Into Membres(Age, Nom, Taille) Values (19,'Ricard',1.75)")
</syntaxhighlight>
</source>
 
Pour modifier un ou plusieurs enregistrements, exécutez une requête du type :
 
<sourcesyntaxhighlight lang=python>
cur.execute("update membres set nom ='Gerart' where nom='Ricard'")
</syntaxhighlight>
</source>
 
Pour supprimer un ou plusieurs enregistrements, utilisez une requête telle que :
 
<sourcesyntaxhighlight lang=python>
cur.execute("delete from membres where nom='Gerart'")
</syntaxhighlight>
</source>
 
Si vous effectuez toutes ces opérations à la ligne de commande de Python, vous pouvez en observer le résultat à tout moment en effectuant un ''pretty print'' comme expliqué plus haut. Étant donné que toutes les modifications apportées au curseur se passent en mémoire vive, rien n'est enregistré définitivement tant que vous n'exécutez pas l'instruction <code>baseDonn.commit()</code>.
Ligne 143 :
Vous pouvez donc annuler toutes les modifications apportées depuis le commit() précédent, en refermant la connexion à l'aide de l'instruction :
 
<sourcesyntaxhighlight lang=python>
baseDonn.close()
</syntaxhighlight>
</source>
 
=== Recherches dans une base de données ===
Ligne 188 :
<li>
(Création de la base de données "musique") :
<sourcesyntaxhighlight lang=python>
import gadfly
 
Ligne 231 :
 
connex.commit()
</syntaxhighlight>
</source>
</li>
</ol>
Ligne 238 :
Commencez à remplir la table <code>compositeurs</code> avec les données qui suivent (... et profitez de cette occasion pour faire la preuve des compétences que vous maîtrisez déjà, en écrivant un petit script pour vous faciliter l'entrée des informations : une boucle s'impose !)
 
<sourcesyntaxhighlight lang=python>
comp a_naiss a_mort
 
Ligne 249 :
Chopin 1810 1849
Bach 1685 1750
</syntaxhighlight>
</source>
 
Dans la table œuvres, entrez les données suivantes :
 
<sourcesyntaxhighlight lang=python>
comp titre duree interpr
 
Ligne 269 :
Mozart Concerto piano N°22 35 S. Richter
Beethoven Concerto piano N°3 37 S. Richter
</syntaxhighlight>
</source>
 
 
Ligne 279 :
Le petit script ci-dessous est fourni à titre purement indicatif. Il s'agit d'un client SQL rudimentaire, qui vous permet de vous connecter à la base de données « musique » qui devrait à présent exister dans l'un de vos répertoires, d'y ouvrir un curseur et d'utiliser celui-ci pour effectuer des requêtes. Notez encore une fois que rien n'est transcrit sur le disque tant que la méthode <code>commit()</code> n'a pas été invoquée.
 
<sourcesyntaxhighlight lang=python>
# Utilisation d'une petite base de données acceptant les requêtes SQL
 
Ligne 304 :
else:
baseDonn.close()
</syntaxhighlight>
</source>
 
Cette application très simple n'est évidemment qu'un exemple. Il faudrait y ajouter la possibilité de choisir la base de données ainsi que le répertoire de travail. Pour éviter que le script ne se « plante » lorsque l'utilisateur encode une requête incorrecte, nous avons utilisé ici le traitement des ''exceptions'' déjà décrit à la page {{todo}}.
Ligne 314 :
Lancez donc le script ci-dessus, et analysez attentivement ce qui se passe lorsque vous proposez les requêtes suivantes :
 
<sourcesyntaxhighlight lang="sql">
select * from oeuvres
select * from oeuvres where comp = 'Mozart'
Ligne 324 :
select sum(duree) from oeuvres where comp='Beethoven'
select * from oeuvres where duree >35 order by duree desc
</syntaxhighlight>
</source>
 
Pour chacune de ces requêtes, tâchez d'exprimer le mieux possible ce qui se passe. Fondamentalement, vous activez sur la base de données des filtres de sélection et des tris. Les requêtes suivantes sont plus élaborées, car elles concernent les deux tables à la fois.
 
<sourcesyntaxhighlight lang="sql">
select o.titre, c.nom, c.a_naiss from oeuvres o, compositeurs c where o.comp = c.comp
select comp from oeuvres intersect select comp from compositeurs
Ligne 334 :
select comp from compositeurs except select comp from oeuvres
select distinct comp from oeuvres union select comp from compositeurs
</syntaxhighlight>
</source>
 
Il ne nous est pas possible de développer davantage le langage de requêtes dans le cadre restreint de ces notes. Nous allons cependant examiner encore un exemple de réalisation Python faisant appel à un système de bases de données, mais en supposant cette fois qu'il s'agisse de dialoguer avec un système serveur indépendant (lequel pourrait être par exemple un gros serveur de bases de données d'entreprise, un serveur de documentation dans une école, etc.).
Ligne 350 :
L'installation et la configuration d'un serveur MySQL sortent du cadre de cet ouvrage, mais ce n'est pas une tâche bien compliquée. C'est même fort simple si vous travaillez sous Linux, installé depuis une distribution « classique » telle que Debian, RedHat, SuSE ou Mandrake. Il vous suffit d'installer les paquetages MySQL-server et Python-MySQL, de démarrer le service MySQL, puis d'entrer les commandes :
 
<sourcesyntaxhighlight lang=shell>
mysqladmin -u root password xxxx
</syntaxhighlight>
</source>
 
Cette première commande définit le mot de passe de l'administrateur principal de MySQL. Elle doit être exécutée par l'administrateur du système Linux (''root''), avec un mot de passe de votre choix. On se connecte ensuite au serveur sous le compte administrateur ainsi défini (le mot de passe sera demandé) :
 
<sourcesyntaxhighlight lang=sql>
mysql -u root mysql -p
grant all privileges on *.* to jules@localhost identified by 'abcde';
grant all privileges on *.* to jules@"%" identified by 'abcde';
\q
</syntaxhighlight>
</source>
 
Ces commandes définissent un nouvel utilisateur « jules » pour le système MySQL, et cet utilisateur devra se connecter le mot de passe « abcde » (Les deux lignes autorisent respectivement l'accès local et l'accès via réseau).
Ligne 369 :
L'utilisateur « jules » peut à présent se connecter et créer des bases de données :
 
<sourcesyntaxhighlight lang=sql>
mysql -u jules -p
create database discotheque;
\q
</syntaxhighlight>
</source>
 
etc.
Ligne 406 :
 
 
<sourcesyntaxhighlight lang=python>
class Glob:
"""Espace de noms pour les variables et fonctions <pseudo-globales>"""
Ligne 426 :
('duree', "i", "durée (en minutes)"),
('interpr', 30, "interprète principal")]}
</syntaxhighlight>
</source>
 
Le dictionnaire d'application décrivant la structure de la base de données est contenu dans la variable <code>Glob.dicoT</code>.
Ligne 444 :
Les objets-interfaces que nous voulons construire seront similaires aux objets-fichiers que nous avons abondamment utilisés pour la gestion des fichiers au chapitre 9. Vous vous rappelez par exemple que nous ouvrons un fichier en créant un objet-fichier, à l'aide de la fonction-fabrique <code>open()</code>. D'une manière similaire, nous ouvrirons la communication avec la base de données en commençant par créer un objet-interface à l'aide de la classe <code>GestionBD()</code>, ce qui établira la connexion. Pour lire ou écrire dans un fichier ouvert, nous utilisons diverses méthodes de l'objet-fichier. D'une manière analogue, nous effectuerons nos opérations sur la base de données par l'intermédiaire des diverses méthodes de l'objet-interface.
 
<sourcesyntaxhighlight lang="python" line>
import MySQLdb, sys
from dict_app import *
Ligne 516 :
if self.baseDonn:
self.baseDonn.close()
</syntaxhighlight>
</source>
 
;Commentaires
Ligne 545 :
Dans une application véritable, ce formulaire trop simpliste devrait certainement être fortement remanié, et il prendrait vraisemblablement la forme d'une fenêtre spécialisée, dans laquelle les champs d'entrée et leurs libellés pourraient encore une fois être générés de manière automatique. Nous ne prétendons donc pas qu'il constitue un bon exemple, mais nous voulons simplement vous montrer comment vous pouvez automatiser sa construction dans une large mesure. Tâchez de réaliser vos propres formulaires en vous servant de principes semblables.
 
<sourcesyntaxhighlight lang="python" line>
class Enregistreur:
"""classe pour gérer l'entrée d'enregistrements divers"""
Ligne 578 :
else:
return 1
</syntaxhighlight>
</source>
 
;Commentaires
Ligne 602 :
Le script qui suit est celui d'une petite application destinée à tester les classes décrites dans les pages qui précèdent. Libre à vous de la perfectionner, ou alors d'en écrire une autre tout à fait différente !
 
<sourcesyntaxhighlight lang="python" line>
###### Programme principal : #########
 
Ligne 652 :
bd.close()
break
</syntaxhighlight>
</source>
 
;Commentaires