Developpez.com - PyQt & PySide
X

Choisissez d'abord la catégorieensuite la rubrique :

FAQ Qt FAQ Qt Creator FAQ PyQt & PySide
logo
Sommaire > QtSql
        Comment créer une base de données ?
        Comment écrire dans une base de données ?
        Comment supprimer une ligne dans une base de données ?
        Comment lire les entrées d'une base de données ?
         Comment afficher le contenu d'une base de données dans un tableau ?





Comment créer une base de données ?
auteur : Jiyuu
Qt offre la possibilité de créer et gérer des bases de données très simplement grâce au module QtSql et notamment les classes QtSql.QSqlDatabase, QtSql.QSqlTableModel et QtSql.QSqlQuery.

La création d'une base de données avec QtSql diffère peu des méthodes traditionnelles (notamment si vous étiez habitué à SQLite3). À noter aussi que QtSql nécessite qu'une instance QtCoreApplication soit créée pour être utilisé. Dans le cas suivant nous créons tout simplement une fenêtre Qt qui créera une instance de la base de données pour y effectuer une requête simple.

QtSql offre la possibilité de travailler avec plusieurs types de bases de données qui sont définis par le pilote appelé. Le gros avantage réside dans le fait que, peu importe le type de base de données choisi, un grand nombre de fonctions sont communes. Donc, si vous savez travailler avec l'un d'eux, vous saurez travailler avec les autres.
# -*- coding: iso-8859-1 -*-
 
import sys, os.path
from PySide import QtCore, QtGui, QtSql
 
h = 300
l = 400
 
class Frame(QtGui.QMainWindow):
    def __init__(self, parent=None):
        ## Création de la fenêtre.
        QtGui.QMainWindow.__init__(self, parent)
        self.resize(l,h)
        self.setFont(QtGui.QFont("Verdana"))
        self.setWindowTitle("Bases de données")
 
        #Création de la basse de données
        self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE") ## Nous indiquons ici le driver avec lequel nous souhaitons travailler. 
        ## Les driver permettent de définir avec quel type de bases de données nous allons travailler. 
        ## Notez qu'il en existe un grand nombre et qu'il vous est même possible d'en personnaliser. Mais ceci sort du contexte actuel.
        self.db.setDatabaseName('myBdd') ## Nous nommons ici notre base de données.
        self.db.open() ## Commande permettant d'accéder à la base de données
        
        query = QtSql.QSqlQuery()
        query.exec_('''create table Contact (id INTEGER PRIMARY KEY,nom TEXT, prenom TEXT)''') 
        ## Création de la table Contact dans notre base de données ouverte.
        self.db.commit() ## Enregistrement de la base de données
        self.db.close() ## Fermeture de celle-ci
 
app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())

Comment écrire dans une base de données ?
auteur : Jiyuu
Pour ajouter une entrée dans une table avec QtSql, il suffit, une fois celle-ci créée et après connexion, d'ajouter une ligne à notre table et de passer, via la fonction setData(index, value), la valeur value dans la colonne index, la première colonne ayant l'index 0.
# -*- coding: iso-8859-1 -*-
 
import sys, os.path
from PySide import QtCore, QtGui, QtSql
 
h = 300
l = 400
 
mybdd = 'myBdd'
 
class Frame(QtGui.QMainWindow):
    def __init__(self, parent=None):
        ## Création de la fenêtre.
        QtGui.QMainWindow.__init__(self, parent)
        self.resize(l,h)
        self.setFont(QtGui.QFont("Verdana"))
        self.setWindowTitle("Bases de données")
    
        txt = QtGui.QLabel("Nom", self)
        txt.move(10, 10)
        self.txt1 = QtGui.QLineEdit("",self)
        self.txt1.move(100,10)
        txt1 = QtGui.QLabel(u"Prénom", self)
        txt1.move(10, 50)
        self.txt2 = QtGui.QLineEdit("",self)
        self.txt2.move(100,50)
        
        self.btn = QtGui.QPushButton("Enregistrer", self)
        self.btn.move(10, 100)
        self.btn.clicked.connect(self.action)
    
    def action(self):
        liste = [self.txt1.text(), self.txt2.text()]
        # Écriture dans dans la basse de données
        ## Les six lignes ci-dessous permettent de se connecter à la base de données et de sélectionner la table dans laquelle on souhaite travailler
        self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName(mybdd)
        self.db.open()
        self.model = QtSql.QSqlTableModel()
        self.model.setTable("Contact")
        self.model.select()
        ## On insère une ligne supplémentaire qui sera remplie par la suite. Si cette ligne de code est oubliée, c'est une modification qui sera effectuée.
        self.model.insertRows(0, 1)
        a = 0
        ## Nous créons une boucle permettant de rentrer les valeurs des QLineEdit dans notre base de données
        while a <= 1:
            ## setData() requiert en premier argument l'index de la ligne à créer, en deuxième la valeur.
            ## Ici dans le premier argument a+1 correspond à la deuxième colonne de notre table si a = 0. On laisse la première colonne se remplir seule (clé automatique).
            ## Le premier argument de self.model.index peut prendre n'importe quelle valeur. Ceci ne change rien.
            self.model.setData(self.model.index(0, a+1), liste[a])
            a+=1
        self.model.submitAll() ## cette commande permet de sauvegarder les modifications effectuées dans la table.
        self.db.close() ## On ferme la base de données.
 
 
app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())
lien : faq Comment créer une base de données ?

Comment supprimer une ligne dans une base de données ?
auteur : Jiyuu
Afin de supprimer une ligne d'une base de données, il suffit d'utiliser la méthode removeRow(row) sur l'objet QSqlTableModel() créé lors de la requête.

Dans le code ci-dessous, nous avons choisi avant tout de filtrer les lignes possédant certaines valeurs, puis de supprimer la première ligne.
self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName("mybdd")
self.db.open()
self.model = QtSql.QSqlTableModel()
self.model.setTable("Contact")
self.model.setFilter("""nom = '%s' and prenom = '%s'""" %(nom1,prenom1))
self.model.select()
self.model.removeRow(0)
self.db.close()
info Par facilité, nous avons choisi de travailler avec SQLite ; cependant, par nature, QtSql supporte une pléthore d'autres SGBD.
lien : faq Comment créer une base de données ?

Comment lire les entrées d'une base de données ?
auteur : Jiyuu
QSQL permettant de travailler avec plusieurs DBMS (database management system ; en français, SGBD, système de gestion de base de données), nous supposons ici qu'une connexion à une base de données a préalablement été faite, self.db représentant cette base de données.

Une fois l'objet QSqlTableModel() créé, la méthode record() permet d'isoler et de travailler sur la ligne ou les lignes voulues de la base données. Afin de lire les entrées correspondant à cette sélection, il suffit d'utiliser la méthode value(id_colonne) ou value(nom_colonne), qui renvoient la valeur contenue dans la colonne choisie. On préfèrera la deuxième solution qui nous assurera que les bonnes valeurs sont envoyées au bon endroit et dans tous les cas de figure.
liste = []
# ...
self.db.open()
self.model = QtSql.QSqlTableModel()
self.model.setTable("Contact")
self.model.select()
nb_row = self.model.rowCount()
 
a = 0
while a < nb_row:
    record = self.model.record(a)
    contact = [record.value("colonne1"), record.value("colonne2")]
    liste.append(contact)
    a +=1
self.db.close()
return liste
Ce petit bout de code permettra de créer une liste des valeurs contenues dans les colonnes portant les noms colonne1 et colonne2 de chaque ligne de la table Contact dans notre base de données défini par self.db.

lien : faq Comment créer une base de données ?

Comment afficher le contenu d'une base de données dans un tableau ?
auteur : Jiyuu
Le module QtSql permet de remplir un tableau très rapidement depuis une base de données. Pour cela, nous il faut tout d'abord se connecter à la base comme vu plus haut, puis utiliser l'objet QtSql.QSqlTableModel() et sa fonction setHeaderData(section, orientation, value) :

  • section : représente le numéro de la colonne de la base de données ;
  • orientation : l'orientation à suivre lors du remplissage du tableau ;
  • value : représente l'étiquette de la colonne de notre tableau.
Évidemment il faudra s'assurer que le tableau à remplir, un QtGui.QTableView(), existe bien.

Ci-dessous, un code d'exemple, où l'on suppose qu'une base de données, contenant une table nommée contact, est correctement ouverte. Dans cette table contact nous y retrouverons, pour chaque ligne :

  • le nom ;
  • le prénom ;
  • la fonction ;
  • le téléphone ;
  • l'email.
Dans le code, tab représente notre QTableView.
self.model = QtSql.QSqlTableModel()
self.model.setTable("contact")
self.model.select()
self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Nom")
self.model.setHeaderData(1, QtCore.Qt.Horizontal, u"Prénom")
self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Fonction")
self.model.setHeaderData(3, QtCore.Qt.Horizontal, u"Téléphone")
self.model.setHeaderData(4, QtCore.Qt.Horizontal, u"Email")
 
tab.setModel(self.model)
Aperçu de la table contact depuis un logiciel d'administration MySQL
Aperçu du QTableView
lien : faq Comment créer une base de données ?

Copyright © 2010 developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Contacter le responsable de la rubrique PyQt & PySide