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 -