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_())
Приведенный выше код производит следующий вывод —