Шаг 167.
Библиотека PyQt5. Работа с базами данных. Выполнение SQL-запросов и получение их результатов. Обработка результатов выполнения запросов
На этом шаге мы рассмотрим методы, используемые для обработки данных, полученых из БД.
Если был выполнен запрос на выборку данных (SQL-команда SELECT), следует получить результат его выполнения. Для этого мы используем описанные далее методы:
- isActive () - возвращает True, если запрос находится в активном состоянии (т. е. у него ранее вызывались методы ехес_() или execBatch()), и False - в противном случае;
- isSelect () - возвращает True, если был выполнен запрос на выборку данных, и False, если исполнялся запрос иного рода.
Запрос на выборку данных поддерживает особый внутренний указатель, указывающий на запись результата, содержимое которой в настоящее время доступно для получения. Однако сразу после
выполнения запроса этот указатель хранит неопределенное значение, не идентифицирующее никакую реальную запись. Поэтому перед собственно выборкой данных необходимо позиционировать этот
указатель на нужную запись;
- first () - позиционирует указатель запроса на первую запись результата. Возвращает True, если позиционирование прошло успешно, и False - в противном случае;
- next () - позиционирует указатель запроса на следующую запись результата или на первую запись, если этот метод был вызван сразу после выполнения запроса. Возвращает True, если позиционирование прошло успешно, и False - в противном случае;
- previous () - позиционирует указатель запроса на предыдущую запись результата или на последнюю запись, если указатель в данный момент находится за последней записью.
Возвращает True, если позиционирование прошло успешно, и False - в противном случае;
- last () - позиционирует указатель запроса на последнюю запись результата. Возвращает True, если позиционирование прошло успешно, и False - в противном случае;
- seek (<Hoмep записи>[, relative=False]) - позиционирует указатель на запись с указанным номером (нумерация записей начинается с нуля). Если необязательным параметром
relative передано значение True, то позиционирование выполняется относительно текущей записи: положительные значения вызывают смещение указателя "вперед" (к концу), а
отрицательные - "назад" (к началу). Возвращает True, если позиционирование прошло успешно, и False - в противном случае;
- isvalid () - возвращает True, если внутренний указатель указывает на какую-либо запись, и False, если он имеет неопределенное значение;
- at () - возвращает номер записи, на которую указывает внутренний указатель запроса;
- size () - возвращает количество записей, находящихся в результате запроса, или -1, если этот запрос не выполнял выборку данных.
Для собственно выборки данных следует применять описанные далее методы:
- value (<Индекс поля>) - возвращает значение поля текущей записи с заданным индексом. Поля нумеруются в том порядке, в котором они присутствуют в таблице базы или
в SQL-коде запроса;
- value (<Имя поля>) - возвращает значение поля текущей записи с заданным именем;
- isNull (<Индекс поля>) - возвращает True, если в поле с указанным индексом нет значения, и False - в противном случае;
- isNull (<Имя поля>) - возвращает True, если в поле с указанным именем нет значения, и False - в противном случае;
- record () - если внутренний указатель установлен на какую-либо запись, возвращает сведения об этой записи, в противном случае возвращаются сведения о самой таблице.
Возвращаемым результатом является экземпляр класса QSqlRecord.
В примере ниже приведен код, извлекающий данные из таблицы good созданной ранее базы данных и выводящий их на экран.
from PyQt5 import QtWidgets, QtSql
import sys
# Создаем объект приложения, иначе поддержка баз данных не будет работать
арр = QtWidgets.QApplication(sys.argv)
con = QtSql.QSqlDatabase.addDatabase('QSQLITE')
con.setDatabaseName('c:\\temp\\data.sqlite')
con.open()
query = QtSql.QSqlQuery()
query.exec("select * from good order by goodname")
lst = []
if query.isActive():
query.first()
while query.isValid():
lst.append(query.value('goodname') + ': ' +
str(query.value('goodcount')) + ' шт.')
query.next()
for p in lst:
print(p)
con.close()
Архив с файлом можно взять
здесь.
Результат работы приложения:
Барабан для принтера: 8 шт.
Бумага для принтера: 3 шт.
Дискета: 10 шт.
На следующем шаге мы рассмотрим очистку запроса.
Предыдущий шаг
Содержание
Следующий шаг