L’auteur a sélectionné le Fonds de secours COVID-19 pour recevoir un don dans le cadre du programme écrire pour les dons.
Introduction
SQLite est une base de données SQL autonome basée sur des fichiers. SQLite est livré avec Python et peut être utilisé dans l’une de vos applications Python sans avoir à installer de logiciel supplémentaire.
dans ce tutoriel, nous allons passer en revue le module sqlite3
en Python 3., Nous allons créer une connexion à une base de données SQLite, ajouter une table à cette base de données, insérer des données dans cette table, lire et modifier les données de cette table.
pour ce tutoriel, nous allons travailler principalement avec un inventaire de poissons que nous devons modifier à mesure que les poissons sont ajoutés ou retirés d’un aquarium fictif.
prérequis
Pour tirer le meilleur parti de ce tutoriel, il est recommandé d’avoir une certaine familiarité avec la programmation en Python et un peu d’arrière-plan de base avec SQL.,
Vous pouvez consulter ces tutoriels pour obtenir les informations générales nécessaires:
- comment coder dans Python3
- Une Introduction aux requêtes dans MySQL
Étape 1 — Création d’une connexion à une base de données SQLite
lorsque nous nous connectons à une base de données SQLite, nous accédons à des données qui Les bases de données SQLite sont des moteurs SQL complets qui peuvent être utilisés à de nombreuses fins. Pour l’instant, nous allons considérer une base de données qui suit l’inventaire des poissons dans un aquarium fictif.,
On peut se connecter à une base de données SQLite en utilisant le Python sqlite3
module:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
donne à notre programme en Python d’accès à la balise sqlite3
module. La fonction sqlite3.connect()
renvoie un objet Connection
que nous utiliserons pour interagir avec la base de données SQLite contenue dans le fichier aquarium.db
. La balise aquarium.db
le fichier est créé automatiquement par sqlite3.connect()
si aquarium.db
n’existe pas déjà sur notre ordinateur.,
nous pouvons vérifier que nous avons créé avec succès notre objet connection
en exécutant:
print(connection.total_changes)
Si nous exécutons ce code Python, nous verrons une sortie comme:
Output0
connection.total_changes
est le nombre total de lignes de base de données qui ont été modifiées par connection
. Puisque nous n’avons pas encore exécuté de commandes SQL, 0 total_changes
est correct.
Si, à tout moment, nous trouvons que nous voulons recommencer ce tutoriel, nous pouvons supprimer le fichieraquarium.db
de notre ordinateur.,
Remarque: Il est également possible de se connecter à une base de données SQLite qui réside strictement en mémoire (et non dans un fichier) en passant la chaîne spéciale ":memory:"
dans sqlite3.connect()
. Par exemple, sqlite3.connect(":memory:")
. Une base de données SQLite ":memory:"
disparaîtra dès la sortie de votre programme Python. Cela peut être pratique si vous souhaitez qu’un bac à sable temporaire essaie quelque chose dans SQLite et que vous n’avez pas besoin de conserver les données après la sortie de votre programme.,
Étape 2 — Ajout de données à la base de données SQLite
maintenant que nous nous sommes connectés à la base de données SQLiteaquarium.db
, nous pouvons commencer à insérer et à lire des données à partir de celle-ci.
Dans une base de données SQL, les données sont stockées dans des tables. Les Tables définissent un ensemble de colonnes et contiennent 0 lignes ou plus avec des données pour chacune des colonnes définies., une table nommée fish
qui suit les données suivantes:
nom | espèces, | tank_number |
---|---|---|
Sammy | requin | 1 |
Jamie | seiche | 7 |
Le fish
table permettra de suivre d’une valeur de name
, species
et tank_number
pour chaque poisson dans l’aquarium., Two example fish
rows are listed: one row for a shark
named Sammy
, and one row for a cuttlefish
named Jamie
.
We can create this fish
table in SQLite using the connection
we made in Step 1:
cursor = connection.cursor()cursor.execute("CREATE TABLE fish (name TEXT, species TEXT, tank_number INTEGER)")
connection.cursor()
returns a Cursor
object. Cursor
objects allow us to send SQL statements to a SQLite database using cursor.execute()
., La balise "CREATE TABLE fish ..."
string est une instruction SQL qui crée une table nommée fish
avec les trois colonnes décrites précédemment: name
de type TEXT
, les espèces de type TEXT
, et tank_number
de type INTEGER
.,
Maintenant que nous avons créé un tableau, on peut insérer des lignes de données:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
Nous appelons cursor.execute()
deux fois: une fois pour insérer une ligne pour le requin Sammy
dans le réservoir 1
, et une fois pour insérer une ligne pour les seiches Jamie
dans le réservoir 7
. "INSERT INTO fish VALUES ..."
est une instruction SQL qui permet d’ajouter des lignes à une table.,
Dans la section suivante, nous allons utiliser un SQL SELECT
déclaration d’inspecter les lignes nous avons inséré dans notre fish
tableau.
Étape 3 — Lecture des données de la base de données SQLite
à L’Étape 2, nous avons ajouté deux lignes à une table SQLite nomméefish
., Nous pouvons récupérer ces lignes à l’aide d’une balise SELECT
instruction SQL:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Si nous exécutez ce code, nous allons voir la sortie comme suit:
Output
Le cursor.execute()
fonction exécute un SELECT
déclaration afin de récupérer les valeurs de la name
, species
, et tank_number
colonnes dans le fish
tableau. fetchall()
récupère tous les résultats de la balise SELECT
déclaration., Lorsque nous print(rows)
nous voyons une liste de deux tuples. Chaque tuple a trois entrées; une entrée pour chaque colonne sélectionnée dans la table fish
. Les deux tuples que les données que nous avons inséré dans l’Étape 2: un tuple de Sammy
le shark
, et un tuple de Jamie
le cuttlefish
.,
Si nous voulions pour extraire des lignes dans le fish
table qui correspondent à un ensemble de critères précis, nous pouvons utiliser un WHERE
l’article:
Si nous courons, nous allons voir le résultat comme suit:
Output
Comme avec l’exemple précédent, cursor.execute(<SQL statement>).fetchall()
nous permet de récupérer tous les résultats d’une SELECT
déclaration. La balise WHERE
clause dans le SELECT
déclaration des filtres pour les lignes dont la valeur de name
est target_fish_name
., Notez que nous utilisons ?
pour remplacer notre target_fish_name
variable dans le SELECT
déclaration. Nous nous attendons à seulement correspondent à une seule ligne, et en effet nous ne voyons que la ligne Jamie
le cuttlefish
retourné.
avertissement: N’utilisez jamais D’opérations de chaîne Python pour créer dynamiquement une chaîne D’instruction SQL. L’utilisation D’opérations de chaîne Python pour assembler une chaîne D’instruction SQL vous rend vulnérable aux attaques par injection SQL. Les attaques par injection SQL peuvent être utilisées pour voler, altérer ou modifier les données stockées dans votre base de données., Utilisez toujours l’espace réservé?
dans vos instructions SQL pour remplacer dynamiquement les valeurs de votre programme Python. Passez un tuple de valeurs comme deuxième argument à Cursor.execute()
pour lier vos valeurs à l’instruction SQL. Ce modèle de substitution est démontré ici et dans d’autres parties de ce tutoriel ainsi.
Étape 4 — modification des données dans la base de données SQLite
Les lignes d’une base de données SQLite peuvent être modifiées à l’aide des instructions SQLUPDATE
etDELETE
.,
disons, par exemple, que Sammy le requin a été déplacé au réservoir numéro 2. Nous pouvons changer Sammy ligne dans la balise fish
table afin de refléter ce changement:
notre UPDATE
instruction SQL pour modifier la balise tank_number
de Sammy
pour sa nouvelle valeur de 2
. La balise WHERE
clause dans le UPDATE
déclaration nous permet de modifier la valeur de la balise tank_number
si une ligne a name = "Sammy"
.,
Si nous exécutons SELECT
déclaration, nous pouvons confirmer notre mise à jour a été faite correctement:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Si nous courons, nous allons voir la sortie comme suit:
Output
Notez que la ligne Sammy
maintenant a la valeur de 2
pour son tank_number
colonne.
disons que Sammy le requin a été relâché dans la nature et n’est plus tenu par l’aquarium., Comme Sammy ne vit plus à l’aquarium, il serait logique de supprimer la ligne Sammy
de la table fish
.
Question DELETE
instruction SQL pour supprimer une ligne:
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
un DELETE
instruction SQL pour supprimer la ligne Sammy
le shark
. La clauseWHERE
dans l’instructionDELETE
garantit que nous supprimons une ligne uniquement si cette ligne aname = "Sammy"
.,
Si nous exécutons SELECT
déclaration, nous pouvons confirmer notre la suppression a été effectuée correctement:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Si nous exécutez ce code, nous allons voir la sortie comme suit:
Output
Notez que la ligne Sammy
le shark
est maintenant disparu, et seulement Jamie
le cuttlefish
reste.,
Étape 5 — Utilisation avec les Instructions Pour le Nettoyage Automatique
Dans ce tutoriel, nous avons utilisé deux principaux objets pour interagir avec la balise "aquarium.db"
base de données SQLite: Connection
objet nommé connection
, et un Cursor
objet nommé cursor
.
De la même manière que les fichiers Python doit être fermé lorsque nous avons fini de travailler avec eux, Connection
et Cursor
objets devraient être fermées lorsqu’elles ne sont plus nécessaires.,
On peut utiliser un with
déclaration pour nous aider à fermer automatiquement Connection
et Cursor
objets:
closing
est une fonction de commodité fournis par la balise contextlib
module. Lorsqu’un with
déclaration des sorties, des closing
assure que close()
est appelée sur un objet est passé. La fonction closing
est utilisée deux fois dans cet exemple., Une fois pour s’assurer que la balise Connection
objet renvoyé par sqlite3.connect()
est automatiquement fermée, et une deuxième fois pour s’assurer que la balise Cursor
objet renvoyé par connection.cursor()
est automatiquement fermé.,
Si nous exécutez ce code, nous allons voir le résultat comme suit:
Output
Depuis "SELECT 1"
est une instruction SQL qui renvoie toujours à une seule ligne avec une seule colonne avec une valeur de 1
, il est logique de voir un seul tuple avec des 1
comme sa seule valeur retournée par notre code.
Conclusion
le modulesqlite3
est une partie puissante de la bibliothèque standard Python; il nous permet de travailler avec une base de données SQL complète sur disque sans installer de logiciel supplémentaire.,
dans ce tutoriel, nous avons appris à utiliser le module sqlite3
pour se connecter à une base de données SQLite, ajouter des données à cette base de données, ainsi que lire et modifier les données de cette base de données. Le long du chemin, nous avons aussi appris les risques d’attaques par injection SQL et comment l’utiliser contextlib.closing
pour appeler automatiquement close()
sur des objets Python dans with
consolidés.
de là, nous pouvons en apprendre davantage sur les bases de données SQL dans SQLite vs MySQL vs PostgreSQL: une comparaison des systèmes de gestion de base de données relationnelle.