Il s'agit de construire et d'utiliser une base de données SQL comportant les données suivantes :
Toutes les tables sont préfixées par ch. Voici la définition SQL de cette table :
CREATE TABLE IF NOT EXISTS `ch_elements` ( `Symbole` char(2), `Nom` tinytext, `Z` tinyint(3), `M` float(9,6), `Groupe` tinyint(2), `Periode` tinyint(2), `Bloc` tinytext, `Orbitales` tinytext, `Electroneg` float(9,6), `Eionisation` float(9,6), PRIMARY KEY (`Symbole`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Pour toutes les tables, on choisit un encodage des caractères latin1 et un interclassement latin1_general_cs, qui permet de faire des requêtes sensibles à la casse (pour différentier par exemple CO et Co).
Voici la signification de ses champs :
Voici par exemple un enregistrement pour l'élément Silicium :
'Si', 'Silicium', 14, 28.090000, 14, 3, 'p', '3s23p2', 1.900000, 8.150000
Cette table est déjà remplie (même s'il manque quelques structures électroniques).
Cette table contient des composés chimiques (ou des ions). Elle peut aussi contenir des éléments simples, par exemple les éléments métalliques. Voici sa définition :
CREATE TABLE IF NOT EXISTS `ch_composes` ( `Symbole` char(20), `Charge` tinyint(2), PRIMARY KEY (`Symbole`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Voici la signification de ses champs :
Voici par exemple l'enregistrement pour deux ions et pour l'eau :
'Fe(2+)',2 'SbO(+)', 1 'H2O',0
Cette table contient la composition des composés définis dans la table composes, c'est-à-dire les éléments chimiques et leur nombre.
Voici la définition de la table :
CREATE TABLE IF NOT EXISTS `ch_compositions` ( `Id` smallint(6) NOT NULL AUTO_INCREMENT, `Compose` char(20), /* clé table ch_composes (Symbole) */ `Element` char(2), /* clé table ch_elements (Symbole) */ `Nombre` tinyint(2), PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Voici la signification de ses champs :
On remarque que les deux clés étrangères font référence à des clés primaires des tables ch_composes et ch_elements.
Voici en exemple les enregistrements pour l'eau et pour un ion :
4, 'H2O', 'H', 2 5, 'H2O', 'O', 1 11, 'SbO(+)', 'Sb', 1 12, 'SbO(+)', 'O', 1
Cette table contient les demi-équations redox et les potentiels redox correspondants. Voici sa définition :
CREATE TABLE IF NOT EXISTS `ch_potentiels` ( `Id` smallint(6) NOT NULL AUTO_INCREMENT, `Famille` char(2), `Oxydant` char(20), /* clé table ch_elements (Symbole) */ `NOxydant` float(4,2), `EtatOxydant` char(2), `Reducteur` char(20), /* clé table ch_composes (Symbole) */ `NReducteur` float(4,2), `EtatReducteur` char(2), `NElectrons` float(4,2), `CompOx` char(20), /* clé table ch_composes (Symbole) */ `NCompOx` float(4,2), `EtatCompOx` char(2), `CompRed` char(20), /* clé table ch_composes (Symbole) */ `NCompRed` float(4,2), `EtatCompRed` char(2), `Potentiel` float(4,2), /* en V */ PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Voici la signification de ses champs :
Pour la réaction suivante :
voici l'enregistrement :
2, 'Sb', 'Sb2O5', 0.50, 's', 'Sb2O3', 0.50, 's', 2.00, 'H(+)', 2.00, NULL, 'H2O', 1.00, NULL, 0.55
Les composés doivent être présents dans la table ch_composes.
Cette table contient les noms de solutions aqueuses.
CREATE TABLE IF NOT EXISTS `ch_solutions` ( `Id` smallint(6) NOT NULL AUTO_INCREMENT, `Nom` char(30), PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Cette table contient la composition des solutions aqueuses :
CREATE TABLE IF NOT EXISTS `ch_compositions_solutions` ( `Id` smallint(6) NOT NULL AUTO_INCREMENT, `Solution` char(30), /*clé table ch_solutions (Nom)*/ `Compose` char(20), /*clé table ch_composes (Symbole)*/ `Concentration` float(6,3), /* en mol/L */ PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Voici par exemple les renregistrements pour une solution de chlorure de sodium :
1, 'NaCl30', 'Na(+)', 0.510 2, 'NaCl30', 'Cl(-)', 0.510
Cette table contient les électrodes utilisées dans les expériences de courbe intensité-potentiel.
CREATE TABLE IF NOT EXISTS `ch_electrodes` ( `Id` smallint(6) NOT NULL AUTO_INCREMENT, `Materiau` char(30), `Surface` float(6,3), /* en mm^2 */ PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Voici un exemple :
2, 'Fer', 38.000
Cette table contient les expériences de courbe intensité-potentiel.
CREATE TABLE IF NOT EXISTS `ch_experiencesIE` ( `Id` int(6) NOT NULL AUTO_INCREMENT, `Solution` char(30), /*clé table ch_solutions (Nom) */ `Electrode` smallint(6), /* clé table ch_electrodes (Id) */ `DureePoint` float(4,1), /* en s */ `Observations` char(200), `Auteur` char(30), PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Voici un exemple :
1, 'NaCl30', 2, 10.0, '', 'F. Legrand'
Cette table contient les courbes intensité-potentiel, c'est-à-dire les points expérimentaux des expériences de courbe intensité-potentiel.
CREATE TABLE IF NOT EXISTS `ch_courbesIE` ( `Id` int(6) NOT NULL AUTO_INCREMENT, `Experience` int(6), /* clé table ch_experiencesIE (Id) */ `Tension` float(4,3), /* en V */ `Courant` float(5,1), /* en mA */ PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs;
Voici par exemple les premiers enregistrements pour la courbe Id=1
1, 1, -1.478, -40.7 2, 1, -1.460, -37.6 3, 1, -1.441, -34.6 4, 1, -1.426, -32.5 5, 1, -1.409, -29.5 6, 1, -1.395, -27.4
La base de données MySQL est hébergée en local sur le serveur S1PEDA. Son nom est mysqlmp2.
L'accès à l'interface phpmyadmin se fait dans un navigateur web à l'adresse S1PEDA/phpmyadmin avec son identifiant et mot de passe personnels (le même que celui des sessions windows). Depuis cette interface, on pourra consulter les tables, remplir certaines tables, ou faire des requêtes SQL.
En Python 2.7, l'accès se fait avec le module MySQLdb. Documentation du module : MySQLdb User's Guide. Voici comment se fait la connexion à la base :
import MySQLdb db = MySQLdb.connect (host = 'S1PEDA', user = 'mysqlmp2', passwd = 'romesole', db = 'mysqlmp2') dbc=db.cursor()
En salle de TP, on utilisera Python 3.5 et le module mysql-connector. Documentation : MySQL Connector. La connexion se fait de la manière suivante :
import mysql.connector db = mysql.connector.connect (host = 'S1PEDA', user = 'mysqlmp2', passwd = 'romesole', db = 'mysqlmp2') dbc=db.cursor()
Voici comment effectuer une requête :
dbc.execute("SELECT Symbole,M FROM ch_elements")
Pour récupérer les résultats de la requête dans un tableau :
result = dbc.fetchall()
Les lignes du tableau sont lues dans une boucle :
for row in result: Symbole = row[0] M = row[1] ....
Pour les requêtes effectuant une écriture (avec INSERT), il peut être nécessaire de récupérer la dernier valeur de l'identifiant auto incrémenté (qui est souvent la clé primaire) :
Id = dbc.lastrowid
Remarque : l'accès avec un script python depuis un client n'est généralement pas possible pour une base de données internet (pour des raisons de sécurité). Dans ce cas, il faudra utiliser un script python CGI tournant sur le serveur, ou un script PHP. Du côté du client, la communication avec ces scripts se fait le plus souvent par des pages HTML contenant du script JAVASCRIPT.
Voici des traitements plus poussés, à réaliser en Python 3.5 :
Les données (potentiel et courant) d'une expérience doivent être dans un fichier texte, soit disposées en colonne, soit disposées en ligne. Lorsqu'on remplit le fichier texte à la main (utiliser Notepad), il est plus commode de les entrer en colonne, sous le format suivant :
E1 I1 E2 I2 E3 I3
Sur une ligne, les données sont séparées par une espace ou une tabulation. Le potentiel doit être en Volts, l'intensité du courant doit être en mA.
Avant d'insérer les données d'une expérience, il faut consulter la table ch_electrodes pour connaître l'identifiant numérique de l'électrode utilisée et la table ch_solutions pour connaître le nom de la solution utilisée.
Le script python suivant permet d'insérer toutes les données d'une expérience :
Ces expériences seront réalisées en TP de chimie puis insérées à l'issu du TP.
Le script Python suivant permet d'extraire les données d'expériences afin de tracer des courbes intensité-potentiel.
Exercice : compléter le script pour qu'il trace sur la même figure toutes les courbes intensité-potentiel correspondant à une électrode et une solution données.