Шаг 172.
Библиотека PyQt5. Работа с базами данных. Выполнение SQL-запросов и получение их результатов. Модели, связанные с данными. Модель, связанная с таблицей
На этом шаге мы рассмотрим основные методы класса, реализующего такую модель.
Если необходимо дать пользователю возможность редактировать данные, хранящиеся в базе, следует использовать класс QSqlTableModel.
Он представляет модель, связанную непосредственно с указанной таблицей базы данных. Иерархия наследования:
QObject - QAbstractItemModel - QAbstractTableModel -
QSqlQueryModel - QSqlTableModel
Конструктор класса:
<Объект> = QSqlTableModel ([parent=None][, db=QSqlDatabase()])
Необязательный параметр db задает соединение с базой данных, запрос к которой следует выполнить, - если он не указан, будет
использоваться соединение по умолчанию.
Класс QSqlTableModel наследует все методы из класса QSqlQueryModel (см. предыдущий шаг)
и в дополнение к ним определяет следующие наиболее полезные для нас методы (полный их список доступен на странице
https://doc.qt.io/qt-5/qsqltablemodel.html):
- setTable (<Имя таблицы>) - задает таблицу, данные из которой будут представлены в модели. Отметим, что этот метод лишь выполняет получение из базы данных структуры указанной таблицы,
но не загружает сами эти данные;
- tableName () - возвращает имя таблицы, заданной для модели;
- setsort (<Индекс столбца>, <Порядок сортировки>) - задает сортировку данных. Если во втором параметре указан
атрибут AscendingOrder класса QtCore.Qt, то сортировка производится в прямом порядке, а если DescendingOrder - то в обратном;
- setFilter (<Условие фильтрации>) - задает условие для фильтрации данных в виде строки в том формате, который применяется в SQL-команде WHERE;
- filter () - возвращает строку с фильтром, заданным для модели;
- select () - считывает в модель данные из заданной ранее таблицы с учетом указанных параметров сортировки и фильтрации. Возвращает True, если
считывание данных прошло успешно, и False - в противном случае. Метод является слотом. Пример:
stm = QtSql.QSqlTableModel(parent=window)
stm.setTable('good')
stm.setSort(1, QtCore.Qt.DescendingOrder)
stm.setFilter('goodcount > 2')
stm.select()
- setEditStrategy (<Peжим редактирования>) -указывает режим редактирования данных в модели. В качестве параметра используется
один из атрибутов класса QSqlTableModel:
- OnFieldChange (или 0) - все изменения переносятся в базу данных немедленно;
- OnRowChange (или 1) - изменения переносятся в базу лишь после того, как пользователь перейдет на другую строку;
- OnManualSubmit (или 2) - изменения переносятся в базу только после вызова метода submit() или submitAll();
- insertRow (<Индекс>[, parent=QModelIndex()]) - вставляет пустую запись в позицию,
заданную первым параметром. Возвращает значение True, если запись была успешно добавлена, и False - в противном случае;
- insertRows (<Индекс>, <Количество>[, parent=QModelIndex()]) - вставляет указанное
количество пустых записей в позицию, заданную первым параметром. Возвращает значение True, если записи были успешно добавлены, и False - в противном случае;
- setData (<QModelIndex>, <3начение>[, role=EditRole]) - задает значение для роли role поля записи, на которое указывает
индекс <QModelIndex>. Возвращает значение True, если данные были успешно занесены в запись, и False - в противном случае;
- removeRow (<Индекс> [, parent=QModelIndex()]) - удаляет запись с указанным индексом. Возвращает значение True, если запись была успешно удалена, и False - в противном случае;
- rernoveRows (<Индекс>, <Количество>[, parent=QModelIndex()]) - удаляет указанное количество записей, начиная с
записи с указанным индексом. Возвращает значение True, если записи были успешно удалены, и False - в противном случае;
Примечание.
Нужно отметить, что после удаления записи вызовом метода removeRow() или removeRows() в модели останется пустая запись, реально
не представляющая никакой записи из таблицы. Чтобы убрать ее, достаточно выполнить повторное считывание данных в модель вызовом метода select().
- insertRecord (<Индекс>, <QSqlRecord>) - добавляет в модель новую запись в позицию, указанную первым параметром, - если значение первого параметра
отрицательное, запись добавляется в конец модели. Добавляемая запись представляется экземпляром объекта QSqlRecord, уже заполненным необходимыми данными.
Возвращает True, если запись была успешно добавлена, и False - в противном случае;
- setRecord (<Индекс>, <QSqlRecord>) - заменяет запись в позиции, указанной первым параметром, новой записью, которая
передается вторым параметром в виде экземпляра объекта QSqlRecord, уже заполненного необходимыми данными. Возвращает True, если
запись была успешно изменена, и False - в противном случае;
- submit () - переносит в базу данных изменения, сделанные в текущей записи, если был задан режим редактирования OnManualSubmit.
Возвращает True, если изменения были успешно перенесены, и False - в противном случае. Метод является слотом;
- submitAll () - переносит в базу данных изменения, сделанные во всех записях, если был задан режим редактирования OnManualSubmit. Возвращает True,
если изменения были успешно перенесены, и False - в противном случае. Метод является слотом;
- revert () - отменяет изменения, сделанные в текущей записи, если был задан режим редактирования OnManualSubmit. Возвращает
True, если изменения были успешно отменены, и False - в противном случае. Метод является слотом;
- revertRow (<Индекс записи>) - отменяет изменения, сделанные в записи с заданным индексом, если был задан режим редактирования OnManualSubmit;
- revertAll () - отменяет изменения, сделанные во всех записях, если был задан режим редактирования OnManualSubmit. Возвращает True, если изменения были успешно
отменены, и False - в противном случае. Метод является слотом;
- selectRow (<Индекс строки>) - обновляет содержимое строки с указанным индексом. Возвращает True, если запись была успешно обновлена, и False - в противном случае. Метод является слотом;
- isDirty (<QModelIndex>) - возвращает True, если запись с указанным индексом (экземпляр класса QModelIndex) была
изменена, но эти изменения еще не были перенесены в базу данных, и False - в противном случае;
- isDirty () - возвращает True, если хотя бы одна запись в модели была изменена, но эти изменения еще не были перенесены в базу данных, и False - в противном случае;
- fieldIndex(<Имя поля>) - возвращает индекс поля с указанным именем или -1, если такого поля нет;
- primaryKey () - возвращает сведения о ключевом индексе таблицы, представленные экземпляром класса QSqlIndex, или пустой
экземпляр этого класса, если таблица не содержит ключевого индекса.
На следующем шаге мы закончим изучение этого вопроса.
Предыдущий шаг
Содержание
Следующий шаг