Formation PUB400 : Python, 2018 Python et SQLite

4.4 Exécuter une requête SQL dans un programme Python


Lorqu'on désire exécuter une requête SQLite en Python, il faut d'abord créer un curseur à l'aide de la méthode cursor(). Le curseur est un objet qui permettra d'exécuter la requête puis de recevoir les résultats retournés par la base de données. Il s'agit en fait d'un intermédiaire entre le programme et la base de données.

C'est la méthode execute() qui se chargera d'envoyer une requête SQL au système de gestion de bases de données SQLite. On lui passe en paramètre la requête à exécuter.

Python

curseur = connexion.cursor()
requete = 'SELECT id, nomfamille, prenom, da FROM etudiants ORDER BY nomfamille, prenom'
curseur.execute(requete)

Cette méthode permet d'exécuter toutes les requêtes CRUD (SELECT, INSERT, UPDATE, DELETE) de même que toute autre requête, par exemple une requête de création de tables.

Python

curseur = connexion.cursor()
requete = 'DELETE FROM etudiants WHERE prenom = "Louis"'
curseur.execute(requete)

Requête sur plusieurs lignes

Il est possible d'écrire la requête SQL sur plus d'une ligne pour en faciliter la lecture. On utilisera lors le triple apostrophe.

Ex :

Python

curseur = connexion.cursor()
requete = '''CREATE TABLE IF NOT EXISTS etudiants (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    nomfamille TEXT,
    prenom TEXT, da TEXT,
    etablissement_id INTEGER,
    FOREIGN KEY(etablissement_id) REFERENCES etablissements(id));'''
curseur.execute(requete)

Requête contenant des variables

Il ne faut jamais utiliser la concaténation ni le formatage de chaînes (avec le symbole %) pour monter une requête SQLite qui contient des variables. Ceci exposerait notre programme à des attaques de type injection SQL.

Mauvaises techniques

Voici un exemple à éviter, qui utiliser la concaténation :

Python

prenom = input('Prénom de l\'élève : ')
 
curseur = connexion.cursor()
requete = 'SELECT id, nomfamille, prenom, da FROM etudiants WHERE prenom = "' + prenom + '"'
curseur.execute(requete)

Voici un autre exemple à éviter, qui utiliser le formatage de chaînes :

Python

prenom = input('Prénom de l\'élève : ')

curseur = connexion.cursor()
requete = 'SELECT id, nomfamille, prenom, da FROM etudiants WHERE prenom = "%s"' % (prenom)
curseur.execute(requete)

Bonne technique

Il faut plutôt utiliser une technique qu'on appelle les requêtes paramétrées.

La technique consiste à placer un point d'interrogation à la place de chacune des variables dans la requête.

Utilisation d'un tableau

Lors de l'exécution de la requête, on doit fournir un second paramètre à la méthode execute(). Il s'agira d'un tableau (appelé liste en Python) qui contient, dans l'ordre, les valeurs à utiliser pour chaque point d'interrogation rencontré.

Python prendra soin, au passage, de protéger la requête contre certains types d'attaques.

Autre avantage : pour les champs de type texte, il n'est plus nécessaire d'entourer la valeur par des apostrophes ou des guillemets. Python le fera pour nous.

Ex :

Python

prenom = input('Prénom de l\'élève : ')
 
curseur = connexion.cursor()
requete = 'SELECT id, nomfamille, prenom, da FROM etudiants WHERE prenom = ?'
curseur.execute(requete, [prenom])

Utilisation d'un tuple

Si vous préférez, il est possible d'utiliser un tuple plutôt qu'une liste, vous obtiendrez des performances légèrement plus intéressantes.

Il faut cependant prendre une précaution lorsqu'il n'y a qu'un seul élément dans le tuple : il faut ajouter une virgule après cet élément. La virgule de fin n'est pas nécessaire lorsque le tuple contient au moins deux éléments.

Ex :

Python

prenom = input('Prénom de l\'élève : ')

curseur = connexion.cursor()
requete = 'SELECT id, nomfamille, prenom, da FROM etudiants WHERE prenom = ?'
curseur.execute(requete, (prenom,))

Pour plus d'information

« A dead simple demonstration of SQL injection in an SQLite database ». GitHub. https://github.com/tasdikrahman/thanos

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre