На этом шаге мы рассмотрим различные методы выполнения запросов.
Чтобы выполнить запрос к базе, сначала следует создать экземпляр класса QSqlQuery. Для этого используется один из следующих форматов вызова его конструктора:
QSqlQuery([<SQL-код>][, db=QSqlDatabase()]) QSqlQuery(<QSqlDatabase>) QSqlQuery(<QSqlQuery>)
Первый формат позволяет сразу задать SQL-код, который следует выполнить, и немедленно запустить его на исполнение. Необязательный параметр db задает соединение с базой данных, запрос к которой следует выполнить, - если он не указан, будет использоваться соединение по умолчанию.
Второй формат создает пустой запрос, не содержащий ни SQL-кода, ни каких-либо прочих параметров, но позволяющий указать соединение к нужной базе данных. Третий запрос создает копию запроса, переданного в параметре.
Для выполнения запросов применяются перечисленные далее методы класса QSqlQuery:
from PyQt5 import QtWidgets, QtSql import sys # Создаем объект приложения, иначе поддержка баз данных не будет работать арр = QtWidgets.QApplication(sys.argv) con = QtSql.QSqlDatabase.addDatabase('QSQLITE') con.setDatabaseName('c:\\temp\\data.sqlite') if con.open(): # Работаем с базой данных if 'good' not in con.tables(): query = QtSql.QSqlQuery() query.exec("create table good (id integer primary key autoincrement, goodname text, goodcount integer)") else: # Выводим текст описания ошибки print(con.lastError().text())
Здесь мы проверяем, есть ли в базе данных таблица good, и, если таковой нет, создаем ее SQL-командой CREATE TABLE.
query.prepare("insert into good values(null, ?, ?)") query.addbindValue('Дискета') query.addbindValue(10) query.exec_()
Здесь мы добавляем в только что созданную таблицу good запись, используя команду INSERT;
query.prepare("insert into good values(null, ?, ?)") query.bindValue(0, 'Дискета') query.bindValue(1, 10) query.exec_()
query.prepare("insert into good values(null, :name, :count)") query.bindValue(':name', 'Дискета') query.bindValue(':count', 10) query.exec_()
Метод возвращает True, если запрос был успешно выполнен, и False - в противном случае. Пример:
. . . . # Работаем с базой данных if 'good' not in con.tables(): query = QtSql.QSqlQuery() query.exec("create table good (id integer primary key autoincrement, goodname text, goodcount integer)") else: query = QtSql.QSqlQuery() query.prepare("insert into good values(null, :name, :count)") lst1 = ['Дискета', 'Бумага для принтера', 'Барабан для принтера'] lst2 = [10, 3, 8] query.bindValue(':name', lst1) query.bindValue(':count', lst2) query.execBatch() . . . .
query.prepare("select * from good order by goodname") query.setForwardOnly(True) query.exec_()
На следующем шаге мы рассмотрим обработку результатов выполнения запросов.