Fermer

octobre 26, 2022

Une introduction à SQLite avec Python


Dans cet article, nous allons botter les pneus de SQLite. Nous allons apprendre à utiliser SQLite via une bibliothèque Python appelée sqlite3. À la toute fin, nous explorerons certaines fonctionnalités plus avancées fournies par sqlite3 pour nous faciliter la tâche.

Remarque : avant de commencer, il est bon de se familiariser avec SQL. Si ce n’est pas le cas, vous voudrez peut-être vérifier Simplement SQL.

Qu’est-ce que SQLite ?

La devise de SQLiteName est petite. Vite. Fiable. Choisissez-en trois.

SQLite est une bibliothèque de base de données intégrée écrite en C. Vous connaissez peut-être d’autres technologies de base de données comme MySQL ou PostgreSQL. Ceux-ci utilisent une approche client-serveur : la base de données est installée en tant que serveur, puis un client est utilisé pour s’y connecter. SQLite est différent : il est connu sous le nom de embarqué base de données, car elle est incluse dans un programme en tant que bibliothèque. Toutes les données sont stockées dans un fichier — généralement avec un .db extension – et vous avez des fonctions qui vous permettent d’exécuter des instructions SQL ou d’effectuer toute autre opération sur la base de données.

La solution de stockage basée sur des fichiers fournit également accès simultané, ce qui signifie que plusieurs processus ou threads peuvent accéder à la même base de données. D’accord, alors quelles sont les utilisations de SQLite ? Est-il adapté à tout type d’application ?

Eh bien, il y a quelques cas où SQLite excelle :

  • Étant inclus sur la plupart des systèmes d’exploitation mobiles, comme Android et iOS, SQLite pourrait être un choix parfait si vous voulez un autonome et sans serveur solution de stockage de données.

  • Au lieu d’utiliser d’énormes fichiers CSV, vous pouvez exploiter la puissance de SQL et mettez toutes vos données dans une seule base de données SQLite.

  • SQLite peut être utilisé pour stocker les données de configuration de vos applications. En fait, SQLite est 35 % plus rapide qu’un système basé sur des fichiers comme un fichier de configuration.

D’autre part, quelles sont les raisons de ne pas choisir SQLite ?

  • Contrairement à MySQL ou PostgreSQL, SQLite manque de fonctionnalités multi-utilisateurs.

  • SQLite reste une solution de stockage de données basée sur des fichiers, pas un service. Vous ne pouvez pas le gérer en tant que processus, vous ne pouvez pas le démarrer ou l’arrêter, ni gérer l’utilisation des ressources.

L’interface Python avec SQLite

Comme je l’ai dit dans l’introduction, SQLite est une bibliothèque C. Il existe cependant des interfaces écrites dans de nombreux langages, y compris Python. La sqlite3 Le module fournit une interface SQL et nécessite au moins SQLite 3.7.15.

Le truc génial c’est que sqlite3 est livré avec Python, vous n’avez donc rien à installer.

Premiers pas avec sqlite3

Il est temps de coder ! Dans cette première partie, nous allons créer une base de données de base. La première chose à faire est de créer une base de données et de s’y connecter :

import sqlite3
dbName = 'database.db'

try:
  conn = sqlite3.connect(dbName)
  cursor = conn.cursor()
  print("Database created!")

except Exception as e:
  print("Something bad happened: ", e)
  if conn:
    conn.close()

Sur la ligne 1, nous importons le sqlite3 bibliothèque. Puis, à l’intérieur d’un try/except bloc de code, nous appelons sqlite3.connect() pour initialiser une connexion à la base de données. Si tout va bien, conn sera un exemple de Connection objet. Si la try échoue, nous imprimons l’exception reçue et la connexion à la base de données est fermée. Comme indiqué dans la documentation officielle, chaque base de données SQLite ouverte est représentée par un Connection objet. Chaque fois que nous devons exécuter une commande SQL, le Connection objet a une méthode appelée cursor(). Dans les technologies de base de données, un curseur est une structure de contrôle qui permet de parcourir les enregistrements d’une base de données.

Maintenant, si nous exécutons ce code, nous devrions obtenir la sortie suivante :

> Database created!

Si nous regardons le dossier où se trouve notre script Python, nous devrions voir un nouveau fichier appelé database.db. Ce fichier a été créé automatiquement par sqlite3.

Créer, lire et modifier des enregistrements

À ce stade, nous sommes prêts à créer une nouvelle table, à ajouter les premières entrées et à exécuter des commandes SQL telles que SELECT, UPDATE ou DROP.

Pour créer une table, il suffit d’exécuter une simple instruction SQL. Dans cet exemple, nous allons créer une table d’étudiants qui contiendra les données suivantes :

identifiantNomnom de famille
1JohnForgeron
2LucieJacobs
3StéphaneTaylor

Après le print("Database created!") ligne, ajoutez ceci :


create_query = '''CREATE TABLE IF NOT EXISTS student(
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  surname TEXT NOT NULL);
  '''
cursor.execute(create_query)
print("Table created!")


cursor.execute("INSERT INTO student VALUES (1, 'John', 'Smith')")
print("Insert #1 done!")
cursor.execute("INSERT INTO student VALUES (2, 'Lucy', 'Jacobs')")
print("Insert #2 done!")
cursor.execute("INSERT INTO student VALUES (3, 'Stephan', 'Taylor')")
print("Insert #3 done!")
conn.commit()
conn.close()

Nous créons une table et appelons le cursor.execute() méthode, qui est utilisée lorsque nous voulons exécuter une seule instruction SQL.

Ensuite, on fait un INSERT pour chaque ligne que nous voulons ajouter. Une fois toutes nos modifications effectuées, nous appelons conn.commit() pour valider la transaction en attente dans la base de données. Sans appeler le commit() méthode, toute modification en attente de la base de données sera perdue. Enfin, nous fermons la connexion à la base de données en appelant le conn.close() méthode.

OK, maintenant interrogeons notre base de données ! Nous aurons besoin d’une variable pour enregistrer les résultats de notre requête, alors enregistrons le résultat de cursor.execute() à une variable appelée records:

records = cursor.execute("SELECT * FROM student")
for row in findrecords:
  print(row)

Après avoir exécuté ceci, nous verrons tous les enregistrements à stdout:

(1, 'John', 'Smith')
(2, 'Lucy', 'Jacobs')
(3, 'Stephan', 'Taylor')

À ce stade, vous avez peut-être remarqué qu’à l’intérieur du cursor.execute() méthode, nous mettons la commande SQL qui doit être exécutée. Rien ne change dans la syntaxe Python si nous voulons exécuter une autre commande SQL comme UPDATE ou DROP.

Les espaces réservés

La cursor.execute() La méthode a besoin d’une chaîne comme argument. Dans la section précédente, nous avons vu comment insérer des données dans notre base de données, mais tout était codé en dur. Que se passe-t-il si nous devons stocker dans la base de données quelque chose qui se trouve dans une variable ? Pour cette raison, sqlite3 a des choses fantaisistes appelées espaces réservés. Espaces réservés nous permettent d’utiliser la substitution de paramètres, ce qui facilitera grandement l’insertion d’une variable dans une requête.

Voyons cet exemple :

def insert_command(conn, student_id, name, surname):
  command = 'INSERT INTO student VALUES (?, ?, ?)'
  cur = conn.cursor()
  cur.execute(command, (student_id, name, surname, ))
  conn.commit()

Nous créons une méthode appelée insert_command(). Cette méthode prend quatre arguments : le premier est un Connection instance, et les trois autres seront utilisés dans notre commande SQL.

Chaque ? à l’intérieur de command variable représente un espace réservé. Cela signifie que si vous appelez le insert_command fonction avec student_id=1, name="Jason" et surname="Green"la INSERT déclaration deviendra INSERT INTO student VALUES(1, 'Jason', 'Green').

Lorsque nous appelons le execute() fonction, nous passons notre commande et toutes les variables qui seront substituées aux espaces réservés. A partir de maintenant, chaque fois que nous avons besoin d’insérer une ligne dans la table des étudiants, nous appelons le insert_command() méthode avec les paramètres requis.

Transactions

Même si vous n’êtes pas nouveau dans la définition d’une transaction, permettez-moi de vous donner un bref récapitulatif de son importance. UN transaction est une séquence d’opérations effectuées sur une base de données qui est logiquement traitée comme une seule unité.

L’avantage le plus important d’une transaction est d’assurer l’intégrité des données. Cela peut être inutile dans l’exemple que nous avons présenté ci-dessus, mais lorsque nous traitons plus de données stockées dans plusieurs tables, les transactions font la différence.

Python sqlite3 module démarre une transaction avant exécuter() et exécuterbeaucoup() exécute INSERT, UPDATE, DELETEou REPLACE déclarations. Cela implique deux choses :

  • Nous devons prendre soin d’appeler le commit() méthode. Si nous appelons Connection.close() sans faire de commit()toutes les modifications que nous avons apportées lors de la transaction seront perdues.
  • Nous ne pouvons pas ouvrir une transaction dans le même processus en utilisant BEGIN.

La solution? Gérer les transactions explicitement.

Comment? En utilisant l’appel de fonction sqlite3.connect(dbName, isolation_level=None) à la place de sqlite3.connect(dbName). En réglant isolation_level à Nonenous forçons sqlite3 de ne jamais ouvrir de transactions implicitement.

Le code suivant est une réécriture du code précédent, mais avec l’utilisation explicite des transactions :

import sqlite3
dbName = 'database.db'

def insert_command(conn, student_id, name, surname):
  command = 'INSERT INTO student VALUES (?, ?, ?)'
  cur = conn.cursor()
  cur.execute("BEGIN")
  try:
    cur.execute(command, (student_id, name, surname, ))
    cur.execute("COMMIT")
  except conn.Error as e:
    print("Got an error: ", e)
    print("Aborting...")
    cur.execute("ROLLBACK")

conn = sqlite3.connect(dbName, isolation_level=None)
cursor = conn.cursor()
print("Database created!")


create_query = '''CREATE TABLE IF NOT EXISTS student(
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  surname TEXT NOT NULL);
  '''
cursor.execute(create_query)
print("Table created!")


insert_command(conn , 1, 'John', 'Smith')
insert_command(conn , 2, 'Lucy', 'Jacobs')
insert_command(conn , 3, 'Stephan', 'Taylor')
insert_command(conn , 4, 'Joseph', 'Random')
findRecords = cursor.execute("SELECT * FROM student")
for row in findRecords:
  print(row)

conn.close()

Conclusion

J’espère que vous comprenez maintenant bien ce qu’est SQLite, comment vous pouvez l’utiliser pour vos projets Python et comment fonctionnent certaines de ses fonctionnalités avancées. La gestion explicite des transactions peut être un peu délicate au début, mais elle peut certainement vous aider à tirer le meilleur parti de sqlite3.

Lecture connexe :




Source link

octobre 26, 2022