PyQt - Gestion de la base de données
L'API PyQt contient un système de classes élaboré pour communiquer avec de nombreuses bases de données SQL. Son QSqlDatabase fournit un accès via un objet Connection. Voici la liste des pilotes SQL actuellement disponibles -
N ° Sr. | Type de pilote et description |
---|---|
1 | QDB2 IBM DB2 |
2 | QIBASE Pilote Borland InterBase |
3 | QMYSQL Pilote MySQL |
4 | QOCI Pilote d'interface d'appel Oracle |
5 | QODBC Pilote ODBC (inclut Microsoft SQL Server) |
6 | QPSQL Pilote PostgreSQL |
sept | QSQLITE SQLite version 3 ou supérieure |
8 | QSQLITE2 SQLite version 2 |
Exemple
Une connexion avec une base de données SQLite est établie à l'aide de la méthode statique -
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
Les autres méthodes de la classe QSqlDatabase sont les suivantes -
N ° Sr. | Méthodes et description |
---|---|
1 |
setDatabaseName() Définit le nom de la base de données avec laquelle la connexion est recherchée |
2 |
setHostName() Définit le nom de l'hôte sur lequel la base de données est installée |
3 |
setUserName() Spécifie le nom d'utilisateur pour la connexion |
4 |
setPassword() Définit le mot de passe de l'objet de connexion, le cas échéant |
5 |
commit() Valide les transactions et renvoie true en cas de succès |
6 |
rollback() Annule la transaction de base de données |
sept |
close() Ferme la connexion |
La classe QSqlQuery a la fonctionnalité pour exécuter et manipuler des commandes SQL. Les requêtes SQL de type DDL et DML peuvent être exécutées. La méthode la plus importante de la classe est exec_ (), qui prend comme argument une chaîne contenant une instruction SQL à exécuter.
query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key,
" "firstname varchar(20), lastname varchar(20))")
Le script suivant crée une base de données SQLite sports.db avec une table de sportifs remplie de cinq enregistrements.
from PyQt4 import QtSql, QtGui
def createDB():
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
if not db.open():
QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"),
QtGui.qApp.tr("Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information "
"how to build it.\n\n" "Click Cancel to exit."),
QtGui.QMessageBox.Cancel)
return False
query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, "
"firstname varchar(20), lastname varchar(20))")
query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')")
query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')")
query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')")
query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')")
query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')")
return True
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
createDB()
La classe QSqlTableModel dans PyQt est une interface de haut niveau qui fournit un modèle de données modifiable pour la lecture et l'écriture d'enregistrements dans une seule table. Ce modèle est utilisé pour remplir un objet QTableView. Il présente à l'utilisateur une vue déroulante et modifiable qui peut être placée sur n'importe quelle fenêtre de niveau supérieur.
Un objet QTableModel est déclaré de la manière suivante -
model = QtSql.QSqlTableModel()
Sa stratégie d'édition peut être définie sur l'une des options suivantes:
QSqlTableModel.OnFieldChange | Tous les changements seront appliqués immédiatement |
QSqlTableModel.OnRowChange | Les modifications seront appliquées lorsque l'utilisateur sélectionne une ligne différente |
QSqlTableModel.OnManualSubmit | Toutes les modifications seront mises en cache jusqu'à ce que submitAll () ou revertAll () soit appelé |
Exemple
Dans l'exemple suivant, la table des sportifs est utilisée comme modèle et la stratégie est définie comme -
model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
model.select()
La classe QTableView fait partie du framework Model / View dans PyQt. L'objet QTableView est créé comme suit -
view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
Cet objet QTableView et deux widgets QPushButton sont ajoutés à la fenêtre QDialog de niveau supérieur. Le signal cliqué () du bouton d'ajout est connecté à addrow () qui exécute insertRow () sur la table modèle.
button.clicked.connect(addrow)
def addrow():
print model.rowCount()
ret = model.insertRows(model.rowCount(), 1)
print ret
L'emplacement associé au bouton de suppression exécute une fonction lambda qui supprime une ligne, qui est sélectionnée par l'utilisateur.
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
Le code complet est le suivant -
import sys
from PyQt4 import QtCore, QtGui, QtSql
import sportsconnection
def initializeModel(model):
model.setTable('sportsmen')
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
model.select()
model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
model.setHeaderData(1, QtCore.Qt.Horizontal, "First name")
model.setHeaderData(2, QtCore.Qt.Horizontal, "Last name")
def createView(title, model):
view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view
def addrow():
print model.rowCount()
ret = model.insertRows(model.rowCount(), 1)
print ret
def findrow(i):
delrow = i.row()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')
model = QtSql.QSqlTableModel()
delrow = -1
initializeModel(model)
view1 = createView("Table Model (View 1)", model)
view1.clicked.connect(findrow)
dlg = QtGui.QDialog()
layout = QtGui.QVBoxLayout()
layout.addWidget(view1)
button = QtGui.QPushButton("Add a row")
button.clicked.connect(addrow)
layout.addWidget(button)
btn1 = QtGui.QPushButton("del a row")
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))
layout.addWidget(btn1)
dlg.setLayout(layout)
dlg.setWindowTitle("Database Demo")
dlg.show()
sys.exit(app.exec_())
Le code ci-dessus produit la sortie suivante -
![](https://post.nghiatu.com/assets/tutorial/pyqt/images/database_handling_output.jpg)