Ceci est une ancienne révision du document !
On a un projet avec gestion d'une base de données relationnelle avec sqlite3.
Dans ce cadre, on peut rentrer des informations dans la base et en sortir des extractions. L'outil bureautique courant est un tableur type Excel ou openoffice.
La liaison entre la base de données et le tableur peut se faire par fichier CSV: cette interface est l'objet de cette page.
Il faut bien dire que les fichiers CSV sont en même temps indispensables et très imparfaits. On va donc ici réduire nos ambitions.
Quand on extrait des données de la base de données, on obtient une “liste de liste”, chaque sous-liste représentant une ligne de données qui pourra donner, après transfert, une ligne de tableur dans Excel.
Voilà, par exemple, une fonction qui permet de lire une table de la base. La base a été ouverte avant par cnx = sqlite3.connect(nomdelabase):
def liretable(cnx, table): """retourne la liste de tous les enregistrements de la table""" cur = cnx.cursor() cur.execute("""SELECT * FROM ?;""", (table,)) liste = cur.fetchall() cur.close() return liste
Et voilà le genre de résultat:
[('Dupond', 'Albert',... ), ('Durand', 'Gilbert', ...)]
Et, bien sûr, le type de données récupérées correspond au type définis dans la table: chaine de caractère, entier ou réel. Ce sera important pour la suite: il faudrait que ces types de données soient transmis par le fichier CSV au tableur!
A l'inverse, pour ajouter ou modifier des donnée à une table, on dispose d'une liste de liste comme précédemment.
Voilà, par exemple, le genre de code qui permet d'ajouter des lignes à une table. La base a été ouverte avant par cnx = sqlite3.connect(nomdelabase):
def ecriretable(cnx, table, LL): """insere toutes les lignes de la liste LL dans la table NB: la longueur des lignes doit correspondre à la table! si la liste LL est vide => ne fait rien """ if len(LL)!=0: cur = cnx.cursor() # préparation de la ligne de requête lg = len(LL[0]) req = ("INSERT INTO " + table + " VALUES " + "(" + '?,'*lg)[:-1] + ')' # insertion des lignes de la table for ligne in LL: cur.execute(req, tuple(ligne)) cnx.commit() cur.close()