PyQt - manipulação de banco de dados

PyQt API contém um elaborado sistema de classes para se comunicar com muitos bancos de dados baseados em SQL. Seu QSqlDatabase fornece acesso por meio de um objeto Connection. A seguir está a lista de drivers SQL disponíveis atualmente -

Sr. Não. Tipo e descrição do driver
1

QDB2

IBM DB2

2

QIBASE

Driver Borland InterBase

3

QMYSQL

Driver MySQL

4

QOCI

Driver de interface de chamada Oracle

5

QODBC

Driver ODBC (inclui Microsoft SQL Server)

6

QPSQL

Driver PostgreSQL

7

QSQLITE

SQLite versão 3 ou superior

8

QSQLITE2

SQLite versão 2

Exemplo

Uma conexão com um banco de dados SQLite é estabelecida usando o método estático -

db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')

Outros métodos da classe QSqlDatabase são os seguintes -

Sr. Não. Métodos e Descrição
1

setDatabaseName()

Define o nome do banco de dados com o qual a conexão é buscada

2

setHostName()

Define o nome do host no qual o banco de dados está instalado

3

setUserName()

Especifica o nome de usuário para conexão

4

setPassword()

Define a senha do objeto de conexão, se houver

5

commit()

Confirma as transações e retorna verdadeiro se for bem-sucedido

6

rollback()

Reverte a transação do banco de dados

7

close()

Fecha a conexão

A classe QSqlQuery tem a funcionalidade de executar e manipular comandos SQL. Ambos os tipos DDL e DML de consultas SQL podem ser executados. O método mais importante da classe é exec_ (), que recebe como argumento uma string contendo uma instrução SQL a ser executada.

query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, 
   " "firstname varchar(20), lastname varchar(20))")

O script a seguir cria um banco de dados SQLite sports.db com uma tabela de esportistas preenchida com cinco registros.

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()

A classe QSqlTableModel em PyQt é uma interface de alto nível que fornece modelo de dados editáveis ​​para leitura e gravação de registros em uma única tabela. Este modelo é usado para preencher um objeto QTableView. Ele apresenta ao usuário uma visualização rolável e editável que pode ser colocada em qualquer janela de nível superior.

Um objeto QTableModel é declarado da seguinte maneira -

model = QtSql.QSqlTableModel()

Sua estratégia de edição pode ser definida como qualquer uma das seguintes -

QSqlTableModel.OnFieldChange Todas as alterações serão aplicadas imediatamente
QSqlTableModel.OnRowChange As alterações serão aplicadas quando o usuário selecionar uma linha diferente
QSqlTableModel.OnManualSubmit Todas as alterações serão armazenadas em cache até que submitAll () ou revertAll () seja chamado

Exemplo

No exemplo a seguir, a tabela do esportista é usada como modelo e a estratégia é definida como -

model.setTable('sportsmen') 
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)

   model.select()

A classe QTableView faz parte da estrutura Model / View no PyQt. O objeto QTableView é criado da seguinte maneira -

view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view

Este objeto QTableView e dois widgets QPushButton são adicionados à janela QDialog de nível superior. O sinal clicado () do botão adicionar é conectado a addrow () que executa insertRow () na tabela do modelo.

button.clicked.connect(addrow)
def addrow():
   print model.rowCount()
   ret = model.insertRows(model.rowCount(), 1)
   print ret

O Slot associado ao botão de exclusão executa uma função lambda que exclui uma linha, que é selecionada pelo usuário.

btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))

O código completo é o seguinte -

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_())

O código acima produz a seguinte saída -