Adapteur SQLite

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

Pour rester cohérent avec le vocabulaire SQLite, le module définit deux classes, Database et Table

Database

Database(db_path[,**kw]) : db_path est le chemin de la base de données dans le système de fichiers. Les arguments par mots-clés sont les mêmes que pour la méthode connect() du module Python pour SQLite

Les instances de Database sont des objets similaires à des dictionnaires, où les clés sont les noms des tables et les valeurs sont des instances de la classe Table

  • db["foo"] renvoie l’instance de la classe Table pour la table”foo”

  • db.keys() renvoie les noms de tables

  • if "foo" in db teste si la table “foo” existe dans la base de données

  • del db["foo"] supprime la table “foo”

Pour créer une nouvelle table

table = db.create(table_name, *fields[,mode])

Les champs doivent être des tuples à 2 éléments (nom_champ, type_champ) où type_champ est un type de champ SQLite

  • INTEGER
  • REAL
  • TEXT
  • BLOB
db.create('test', ('name', 'TEXT'), ('age', 'INTEGER'), ('size', 'REAL'))

S’il faut fournir d’autres informations, les mettre dans le deuxième argument, avec la syntaxe SQL propre à SQLite

db.create('test', ('date', 'BLOB DEFAULT CURRENT_DATE'))

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.

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

table.insert(list_of_values)

sera beaucoup plus rapide que

for values in list_of_values:
    table.insert(values)

La seule différence est qu’on ne peut pas utiliser la méthode drop_field(), parce que la suppression de champs n’est pas supportée par SQLite

Type conversion

Si vous voulez que des champs soient renvoyés comme instances de datetime.date, datetime.time ou datetime.datetime, vous devez le spécifier quand vous créez ou ouvrez la table, en utilisant les méthodes is_date(nom_champ), is_time(nom_champ) ou is_datetime(nom_champ)

Les méthodes de sélection renvoient des dictionnaires, dans lesquels les types SQLite sont convertis en types Python de cette façon

SQLite type Python type
NULL None
TEXT unicode
BLOB str
INTEGER int
REAL float

Si vous voulez que des champs soient renvoyés comme instances de datetime.date, datetime.time ou datetime.datetime, vous devez le spécifier quand vous créez ou ouvrez la table, en utilisant les méthodes is_date(field_name), is_time(field_name) ou is_datetime(field_name).

db = Database('test.sqlite')
table = db['dummy']
table.is_date('birthday')

cursor et commit

Les intances de Database et Table ont toutes l’attribut cursor, le curseur de la connection SQLite. On peut donc exécuter des expressions SQL par

db.cursor.execute(some_sql)

et récupérer les résultats par

results = db.cursor.fetchall()

la méthode commit() pour confirmer les changements à la base de données en fin de transaction

db.commit()