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.
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.
curseur = connexion.cursor()
requete = 'DELETE FROM etudiants WHERE prenom = "Louis"'
curseur.execute(requete)
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 :
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)
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.
Voici un exemple à éviter, qui utiliser la concaténation :
prenom = input('Prénom de l\'élève : ')
curseur = connexion.cursor()
requete = 'SELECT id, nomfamille, prenom, da FROM etudiants WHERE prenom = "' '"'
curseur.execute(requete)
Voici un autre exemple à éviter, qui utiliser le formatage de chaînes :
prenom = input('Prénom de l\'élève : ')
curseur = connexion.cursor()
requete = 'SELECT id, nomfamille, prenom, da FROM etudiants WHERE prenom = " "' curseur.execute(requete)
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.
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 :
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])
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 :
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,))
« A dead simple demonstration of SQL injection in an SQLite database ». GitHub. https://github.com/tasdikrahman/thanos
▼Publicité
Site fièrement hébergé chez A2 Hosting.