English

Adaptateur MySQL

La principale différence avec le module en pur Python est la syntaxe pour identifier une base de donnéese t une table, et la nécessité de spécifier le type des champs quand on crée une base

Pour rester compatible avec le vocabulaire de MySQL, le module définit trois classes, Connection, Database et Table

Connection

Connection(hote,identifiant,mot_de_passe[,charset]) : renvoie une connection au serveur MySQL. Si le paramètre optionnel charset est fourni, les champs TEXT doivent être insérés comme chaînes Unicode, ou comme leur encodage dans ce charset ; les valeurs lues depuis la base de données seront aussi des chaînes Unicode

Les instances de Connection sont des objets similaires à des dictionaires : les clés sont les noms des bases de données et les valeurs sont les instances correspondantes de la classe Database

Par exemple :

  • conn.keys() renvoie la liste des noms de bases de données
  • conn[nom_bdd] renvoie l'instance de Database pour la base de données nom_bdd
  • del conn[nom_bdd] supprime la base de données nom_bdd (toutes les tables de cette base de données doivent avoir été supprimées précédemment)

Elles possèdent une autre méthode :

  • create(nom_bdd) : crée une base de données appelée nom_bdd et renvoie l'instance correspondante de la classe Database

Database

Les instances de Database sont des objets similaires à des dictionnaires : les clés sont les noms de tables et les valeurs sont les instances correspondantes de la classe Table class. Par exemple :

  • db.keys() renvoie la liste des noms de tables dans la base de données
  • db[nom_table] renvoie l'instance de Table appelée nom_table
  • del db[nom_table] : supprime la table appelée nom_table

Elles possèdent une autre méthode :

  • create(nom_table,*champs[,**mode]) : crée une table appelée nom_table et renvoie l'instance de la classe Table

    champs sont des tuples à 2 éléments (nom_champ,type_champ) où nom_champ est le nom du champ et type_champ est un type de champ MySQL : INTEGER, REAL, DATETIME, CHAR, BLOB,etc. :

    db.create('test',('nom','CHAR(20)'),('age','INTEGER'),('taille','REAL'))

    S'il faut fournir des informations supplémentaires sur les types, les mettre dans le deuxième argument, en se servant de la syntaxe SQL propre à MySQL :
    db.create('test',('recid','INTEGER PRIMARY KEY AUTO_INCREMENT'),
         ('date','TIMESTAMP DEFAULT CURRENT_TIMESTAMP'))

    Le mot-clé optionnel mode spécifie ce qu'il faut faire si une table du même nom existe déjà

    • mode="open" ouvre la table et ignore les définitions de champs
    • mode="override" efface la table existante et en crée une nouvelle avec les définitions de champs
    • si mode n'est pas spécifié et que la table existe déjà, une exception IOError est déclenchée

Table

Pour l'insertion, la sélection, la mise à jour et la suppression, la syntaxe est la même que pour le module en pur Python

La sélection par identifiant d'enregistrement ne fonctionne que si un champ a été défini comme clé primaire ou avec le mode AUTO_INCREMENT ; les fonctions delete() et update() requièrent aussi ce champ

Pour insérer de nombreux enregistrements en une seule fois,

table.insert(liste_de_valeurs)

sera beaucoup plus rapide que

for valeurs in liste_de_valeurs:
    table.insert(valeurs)

cursor et commit

Les intances de Database et Table ont toutes :
  • l'attribut cursor, le curseur de la connection MySQL. On peut donc exécuter des expressions SQL par
    db.cursor.execute(expr_sql)
    et récupérer les résultats par
    resultats = db.cursor.fetchall()
  • la méthode commit() pour confirmer les changements à la base de données en fin de transaction