Учебники

PyQt — Обработка базы данных

PyQt API содержит сложную систему классов для связи со многими базами данных на основе SQL. Его QSqlDatabase обеспечивает доступ через объект Connection. Ниже приведен список доступных в настоящее время драйверов SQL —

Sr.No. Тип и описание драйвера
1

QDB2

IBM DB2

2

QIBASE

Borland InterBase Driver

3

QMYSQL

MySQL Driver

4

QOCI

Драйвер интерфейса вызова Oracle

5

QODBC

Драйвер ODBC (включает Microsoft SQL Server)

6

QPSQL

PostgreSQL драйвер

7

QSQLITE

SQLite версии 3 или выше

8

QSQLITE2

SQLite версия 2

QDB2

IBM DB2

QIBASE

Borland InterBase Driver

QMYSQL

MySQL Driver

QOCI

Драйвер интерфейса вызова Oracle

QODBC

Драйвер ODBC (включает Microsoft SQL Server)

QPSQL

PostgreSQL драйвер

QSQLITE

SQLite версии 3 или выше

QSQLITE2

SQLite версия 2

пример

Соединение с базой данных SQLite устанавливается статическим методом —

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

Другие методы класса QSqlDatabase следующие:

Sr.No. Методы и описание
1

setDatabaseName ()

Устанавливает имя базы данных, с которой ищется соединение

2

setHostName ()

Устанавливает имя хоста, на котором установлена ​​база данных

3

setUserName ()

Определяет имя пользователя для подключения

4

Установка пароля()

Устанавливает пароль объекта подключения, если таковой имеется

5

совершить ()

Подтверждает транзакции и возвращает true в случае успеха

6

откат ()

Откат транзакции базы данных

7

близко()

Закрывает связь

setDatabaseName ()

Устанавливает имя базы данных, с которой ищется соединение

setHostName ()

Устанавливает имя хоста, на котором установлена ​​база данных

setUserName ()

Определяет имя пользователя для подключения

Установка пароля()

Устанавливает пароль объекта подключения, если таковой имеется

совершить ()

Подтверждает транзакции и возвращает true в случае успеха

откат ()

Откат транзакции базы данных

близко()

Закрывает связь

Класс QSqlQuery обладает функциональностью для выполнения команд SQL и управления ими. Могут быть выполнены как SQL-запросы DDL, так и DML-типа. Наиболее важным методом в классе является exec_ (), который принимает в качестве аргумента строку, содержащую инструкцию SQL для выполнения.

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

Следующий скрипт создает базу данных SQLite sports.db с таблицей sportsperson, заполненной пятью записями.

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

Класс QSqlTableModel в PyQt — это высокоуровневый интерфейс, который предоставляет редактируемую модель данных для чтения и записи записей в одной таблице. Эта модель используется для заполнения объекта QTableView. Он предоставляет пользователю прокручиваемый и редактируемый вид, который можно поместить в любое окно верхнего уровня.

Объект QTableModel объявляется следующим образом:

model = QtSql.QSqlTableModel()

Его стратегия редактирования может быть установлена ​​на любой из следующих параметров:

QSqlTableModel.OnFieldChange Все изменения будут применены немедленно
QSqlTableModel.OnRowChange Изменения будут применены, когда пользователь выберет другую строку
QSqlTableModel.OnManualSubmit Все изменения будут кэшироваться до тех пор, пока не будет вызвана submitAll () или revertAll ()

пример

В следующем примере таблица спортсмена используется в качестве модели, а стратегия задается как —

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

   model.select()

Класс QTableView является частью инфраструктуры Model / View в PyQt. Объект QTableView создается следующим образом:

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

Этот объект QTableView и два виджета QPushButton добавляются в окно QDialog верхнего уровня. Сигнал clicked () кнопки add связан с addrow (), который выполняет insertRow () для таблицы модели.

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

Слот, связанный с кнопкой удаления, выполняет лямбда-функцию, которая удаляет строку, выбранную пользователем.

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

Полный код выглядит следующим образом —

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

Приведенный выше код производит следующий вывод —