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 -