- Что такое PyMySQL?
- Начало Работы С Python MySQL
- Получение значения из таблицы
- Функция locals() в Python
- Подключение к базе данных SQLite из клиента SQL (DBeaver)
- Основные методы в Python MySQL
- 1. MySQL connect()
- 2. Курсор MySQL()
- 3. Выполнение MySQL()
- 4. Закрытие MySQL()
- 5. Фиксация MySQL()
- 6. MySQL извлекает все()
- 7. MySQL is_connected()
- Использование различных SQL-дайверов
- Первые шаги с SQLite в Python
- Создание базы данных SQLite в Python
- Резидентная база данных
- Создание объекта cursor
- Создание таблиц в SQLite в Python
- Добавление данных с SQLite в Python
- Выполнение запросов
- Создание таблицы и вставка значений с CREATE и INSERT
- Обновление данных с UPDATE
- Чтение данных через SELECT
- Удаление данных с DELETE
- Параметризация запроса
- Как установить PyMySQL?
- Доступ к коду SQL
- Создайте объект курсора
- Подробнее об определениях
- Проверка является ли переменная строковой в Python
- Подключение к базе данных
- пример
- Создание таблицы базы данных
- пример
- Выполнение SQL-запросов с помощью PyQt
- Открытие соединения с базой данных
- Транзакции
- timeout транзакции
- ВСТАВИТЬ Операция
- пример
- Ссылка на уже существующую таблицу
- Включение записей
- Типы данных SQLite в Python
Что такое PyMySQL?
PyMySQL — это интерфейс для подключения к серверу базы данных MySQL из Python. Он реализует Python Database API v2.0 и содержит чистую клиентскую библиотеку Python для MySQL. Цель PyMySQL — быстро заменить MySQLdb.
Начало Работы С Python MySQL
В этом руководстве мы будем использовать панель управления Xampp для подключения к локальному серверу и создания нашей базы данных. Запуск Apache и MySQL в Xampp делает свою работу.
Затем мы можем нажать https: // localhost / phpmyadmin / напрямую, чтобы открыть интерфейс нашего локального сервера, как показано ниже.
Вот моя база данных, а studentdb — это некоторые из баз данных, которые я создал ранее.
Получение значения из таблицы
Теперь, когда у нас есть таблица с начальными значениями, давайте запросим таблицу, чтобы получить все ее строки. Мы не можем просто напечатать объект курсора, поэтому мы должны явно получить атрибуты с помощью cursor.fetchall () и распечатать их, перебирая их.
импортировать sqlite3 db_file = ‘database.db’ с sqlite3.connect (db_file) как conn: cursor = conn.cursor () cursor.execute («» «выбрать * из изображений» «») для строки в cursor.fetchall () : имя, размер, дата = строка печати (f ‘{имя} {размер} {дата}’)
Производство
sample.png 100 2019-10-10 ask_python.png 450 2019-05-02 class_room.jpeg 1200 2018-04-07
Функция locals() в Python
Подключение к базе данных SQLite из клиента SQL (DBeaver)
Поскольку я использую Google Colab, я загружу файл my-test.db на свой компьютер. Когда вы запускаете Python на локальном компьютере, вы можете использовать клиент SQL для прямого подключения к файлу базы данных.
Создайте новое соединение в DBeaver и выберите SQLite в качестве типа БД:
Затем перейдите в файл базы данных:
Теперь вы можете выполнить любой SQL-запрос к базе данных, как и любую другую реляционную базу данных:
Основные методы в Python MySQL
Теперь, когда у нас установлен pymysql, давайте рассмотрим некоторые из основных методов, которые мы будем использовать сегодня.
1. MySQL connect()
Метод pymysql.connect () подключается к базе данных MySQL из Python и возвращает объект MySqlConnection. Затем этот объект можно использовать для доступа ко всей базе данных и выполнения других операций. Примите такие параметры, как хост, пользователь, пароль и база данных, как специфические для базы данных, к которой вы хотите подключиться.
- user — для локальных серверов пользователь должен быть указан как «root», в противном случае вы можете создать пользователя, перейдя по этой ссылке ,
- пароль — зависит от того, какой пароль вы использовали при создании пользователя. База данных также может быть без пароля (в нашем примере),
- host — для локального сервера, использующего xampp, мы можем использовать localhost для доступа к базе данных. Мы также можем использовать IP-адрес сервера или имя хоста для входа в систему,
- база данных — это имя базы данных, которую вы будете использовать. Если вы уже создали базу данных, вы можете просто указать здесь ее имя.
2. Курсор MySQL()
Метод cursor () создает объект курсора, который впоследствии можно использовать для выполнения операций CRUD (создание, получение, обновление и удаление) в базе данных.
3. Выполнение MySQL()
Метод execute () выполняет переданный ему SQL-запрос с помощью курсора, созданного ранее.
4. Закрытие MySQL()
Метод close (), определенный как в курсоре, так и в классе MySqlConnection, используется для закрытия соответствующих объектов.
5. Фиксация MySQL()
Метод commit () отправляет запрос COMMIT серверу MySQL, а затем фиксирует текущую транзакцию данных.
6. MySQL извлекает все()
Метод fetchall () извлекает все строки набора результатов запроса и возвращает список кортежей, используя объект курсора.
7. MySQL is_connected()
Этот метод проверяет, доступно ли соединение с сервером MySQL. Возвращает True, если да, и False, если нет.
Использование различных SQL-дайверов
Итак, вы узнали, как создать соединение с базой данных с помощью драйвера SQLite. Это не единственный драйвер, доступный в PyQt. Библиотека предоставляет богатый набор драйверов SQL, которые позволяют использовать различные типы систем управления базами данных в соответствии с вашими конкретными потребностями:
Название системы управления базой данных
QDB2 | IBM Db2 (версия 7.1 и новее) |
QIBASE | Borland InterBase |
QMYSQL / MARIADB | MySQL или MariaDB (версия 5.0 и новее) |
QOCI | Интерфейс вызова Oracle |
QODBC | Открытое подключение к базе данных (ODBC) |
QPSQL | PostgreSQL (версии 7.3 и новее) |
QSQLITE2 | SQLite 2 (устарело с Qt 5.14) |
QSQLITE | SQLite 3 |
QTDS | Sybase Adaptive Server (устарело с Qt 4.7) |
Столбец «Имя драйвера» содержит идентифицирующие строки, которые необходимо передать в .add Database () в качестве первого аргумента для использования связанного драйвера. В отличие от драйвера SQLite, при использовании другого драйвера вам может потребоваться установить различные атрибуты, такие как имя базы данных, имя хоста, имя пользователя и пароль, для правильной работы соединения.
Драйверы базы данных являются производными от QSqlDriver. Вы можете создать свои собственные драйверы базы данных, создав подкласс QSqlDriver, но эта тема выходит за рамки данного руководства. Если вы заинтересованы в создании собственных драйверов базы данных, ознакомьтесь с более подробной информацией о том, как написать собственный драйвер базы данных.
Первые шаги с SQLite в Python
Начнем обучение с загрузки библиотеки. Для этого используйте следующую команду:
импортировать sqlite3
Следующим шагом будет создание базы данных.
Создание базы данных SQLite в Python
Есть несколько способов создать базу данных на Python с помощью SQLite. Для этого используется объект Connection, являющийся основой. Он создается с помощью функции connect().
Давайте создадим файл .db, поскольку это стандартный способ управления базой данных SQLite. Файл будет называться order.db. За соединение будет отвечать переменная conn.
conn = sqlite3.connect (‘orders.db’)
Эта строка создает объект подключения и новый файл order.db в рабочем каталоге. Если необходимо использовать еще один, он должен быть явно обозначен:
conn = sqlite3.connect (r’Путь-К-ПАПКА / orders.db’)
Если файл уже существует, функция подключения подключится к нему.
перед линией пути стоит символ «r». Это дает понять Python, что мы говорим о «сырой» строке, где символы «/» не отвечают за экранирование.
Функция connect создает соединение с базой данных SQLite и возвращает объект, который ее представляет.
Резидентная база данных
Другой способ создания баз данных с использованием SQLite в Python — создание их в памяти. Это отличный вариант для тестирования, потому что такие базы данных существуют только в оперативной памяти.
conn = sqlite3.connect (: память:)
Однако в большинстве случаев (и на протяжении всего этого руководства) будет использоваться метод, описанный выше.
Создание объекта cursor
После создания объекта подключения к базе данных необходимо создать объект курсора. Он позволяет делать SQL-запросы к базе данных. Мы используем cur для хранения объекта:
cur = conn.cursor()
Теперь вы можете запускать запросы следующим образом:
cur.execute («ВАШ-SQL-ЗАПРОС-ЗДЕСЬ;»)
Обратите внимание, что сами запросы должны быть заключены в кавычки — это важно. Это могут быть одинарные, двойные или тройные кавычки. Последние используются в случае очень длинных запросов, которые часто записываются в несколько строк.
Создание таблиц в SQLite в Python
пришло время создать первую таблицу в базе данных. Это можно сделать с помощью объектов подключения (conn) и курсора (cur). Мы будем следовать этому шаблону.
Начнем с пользовательской таблицы.
cur.execute («» «СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ пользователи (идентификатор пользователя INT PRIMARY KEY, fname TEXT, lname TEXT, type TEXT);» «») conn.commit()
Приведенный выше код делает следующее:
- Функция выполнения отвечает за SQL-запрос
- SQL генерирует пользовательскую таблицу
- IF NOT EXISTS поможет при повторном подключении к базе данных. Запрос проверит, существует ли таблица. Если да, он проверит, ничего не изменилось.
- Создайте первые четыре столбца: идентификатор пользователя, имя файла, имя пользователя и пол. ID пользователя — это первичный ключ.
- Сохраняем изменения, используя функцию фиксации на объекте подключения.
Чтобы создать вторую таблицу, просто повторите последовательность, используя следующие команды:
cur.execute («» «СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ Заказы (orderid INT PRIMARY KEY, date TEXT, userid TEXT, total TEXT);» «») conn.commit()
После запуска этих двух сценариев база данных будет включать две таблицы. Теперь вы можете добавлять данные.
Добавление данных с SQLite в Python
Подобно запросу, чтобы создать таблицы для добавления данных, вы также должны использовать объект курсора.
cur.execute («» «INSERT INTO users (userid, fname, lname, gender) VALUES (‘00001’, ‘Alex’, ‘Smith’, ‘male’);» «») conn.commit()
В Python вам часто приходится иметь дело с переменными, хранящими значения. Например, это может быть кортеж с пользовательской информацией.
user = (‘00002’, ‘Лоис’, ‘Дорожка’, ‘Женщина’)
Если он должен быть загружен в базу данных, подходит следующий формат:
cur.execute («ВСТАВИТЬ В ЗНАЧЕНИЯ пользователей (?,?,?,?);», пользователь) conn.commit()
В этом случае все значения были заменены вопросительными знаками, и был добавлен параметр, содержащий значения, которые нужно добавить.
важно отметить, что SQLite ожидает получать значения в формате кортежа. Однако переменная также может содержать список с набором кортежей. Таким образом вы можете добавить больше пользователей:
more_users = (‘00003’, ‘Питер’, ‘Паркер’, ‘Мужчина’), (‘00004’, ‘Брюс’, ‘Уэйн’, ‘мужчина’)
Но вы должны использовать функцию executemany вместо обычного execute:
cur.executemany («ВСТАВИТЬ ЗНАЧЕНИЯ пользователей (?,?,?,?);», more_users) conn.commit()
Если применяется execute, функция будет думать, что пользователь хочет передать в таблицу два объекта (два кортежа), а не два кортежа, каждый из которых содержит 4 значения для каждого пользователя. Хотя, в первую очередь, должна была быть ошибка.
Выполнение запросов
Чтобы создать таблицу в реляционных базах данных, нам нужно определить типы данных, которые будут в ней храниться. Мы создадим таблицу, в которой будут храниться имя файла, размер и дата создания.
имя | измерение | дата |
pic1.jpg | 50 КБ | 2021-12-19 |
pic2.jpg | 60 КБ | 2021-12-20 |
Создание такой таблицы выполняется в несколько этапов.
Создание таблицы и вставка значений с CREATE и INSERT
Любая таблица состоит из столбцов. Эти столбцы определяют типы данных. В нашем случае чистый SQL-запрос, который создаст таблицу, будет следующим:
СОЗДАТЬ ТАБЛИЦУ изображения (первичный ключ текста имени, текста измерения, даты даты);
Другой запрос, который вставит эти данные в таблицу:
ВСТАВЬТЕ В изображения (имя, размер, дата) ЗНАЧЕНИЯ (‘pic1.jpg’, ’50KB’, ‘2021-12-19’), (‘pic2.jpg’, ’50KB’, ‘2021-12-20’)
Чтобы выполнить эти запросы, вам нужно использовать курсор, используя один из методов, описанных выше. Это могло бы выглядеть так:
import sqlite3 # запрос на создание таблицы query1 = » ‘CREATE TABLE images (имя текста первичного ключа, размер текста, дата и дата);’ » # запрос для вставки данных query2 = » ‘INSERT INTO images (name, size, date) VALUES («pic1.jpg», «50KB», «2021-12-19»), («pic2.jpg», «50KB», «2021-12-20″) » ‘database =’ database db ‘connection = sqlite3.connect (database) # выполнить первый запрос connection.execute (query1) # выполнить второй запрос connection.execute (query2) connection .commit () соединение .close()
Вы можете узнать, сколько строк было изменено, с помощью следующего запроса:
connection.execute (запрос1) .rowcount()
Другой метод total_changes (), который показывает, сколько строк было изменено во всей базе данных с момента подключения:
connection.total_changes()
Каждое изменение базы данных должно сопровождаться методом фиксации, который подтверждает, что результат был успешным, и должен быть сохранен в базе данных.
Обновление данных с UPDATE
В SQL вы можете обновить одно из значений в базе данных с помощью оператора UPDATE. Итак, за счет чистого SQL изменим имя одной из ранее созданных строк:
ОБНОВЛЕНИЕ изображений НАБОР name = ‘newpic.jpg’ WHERE name = ‘pic1.jpg’
При использовании sqlite и python этот запрос выполняется так же, как INSERT:
import sqlite3 # запрос на изменение строки query1 = » ‘REFRESH images SET name =’ newpic.jpg ‘WHERE name =’ pic1.jpg ‘; » ‘database =’ database.db ‘connection = sqlite3.connect (база данных) connection.execute (query1) connection.commit () connection.close()
Если фиксация не удалась, результат не будет сохранен в базе данных.
Чтение данных через SELECT
Чтение данных из базы данных осуществляется перемещением курсора. Этот процесс выполняется с помощью методов fetchone или fetchall, которые возвращают кортеж:
импортировать sqlite3 из contextlib import close database = ‘database.db’ with close (sqlite3.connect (database)) as connection: cursor = connection.cursor () cursor.execute («» «выбрать * из изображений» «») # получить распечатать все значения (cursor.fetchall())
fetchone () будет возвращать строку после каждого вызова:
import sqlite3 from contextlib import close database = ‘database.db’ with close (sqlite3.connect (database)) as connection: cursor = connection.cursor () cursor.execute («» «выбрать * из изображений» «») print (‘1:’, cursor.fetchone ()) print (‘2:’, cursor.fetchone ()) print (‘3:’, cursor.fetchone())
Удаление данных с DELETE
SQL-запрос, который удалит строку с использованием столбца «имя», будет выглядеть следующим образом:
УДАЛИТЬ ИЗ изображений, ГДЕ name = ‘newpic.jpg’
В коде Python это будет выглядеть так:
import sqlite3 # запрос на изменение строки query1 = » ‘УДАЛИТЬ ИЗ изображений WHERE name =’ newpic.jpg ‘; » ‘database =’ database.db ‘connection = sqlite3.connect (база данных) connection.execute (query1) connection.commit () connection.close()
Параметризация запроса
Возможно, вам потребуется передать в SQL дополнительные параметры. Вы можете использовать форматирование строки Python, но это будет ошибкой:
value = ‘pic2.jpg’ cursor.execute (f’select * из изображений, где name = «{value}»‘)
Проблема с этим методом заключается в том, что пользователь может передать другой SQL-запрос вместо «значения». Это действие называется SQL-инъекцией. Каждый параметр, переданный в SQL, требует дополнительных проверок и уже реализован в методе execute:
values = (‘pic2.jpg’, ‘pic1.jpg’) cursor.execute (‘выбрать * из изображений, где name =? или name =?’, values)
То есть вместо «?» значения кортежа будут заменены для нас.
Мы можем создать несколько запросов, используя .executemany (). В следующем примере будет выполнено 2 разных «INSERT» для каждого из кортежей (с точки зрения SQL этот подход считается плохой практикой):
values = (‘pic4.jpg’, ’52KB’, ‘2021-12-19’), (‘pic5.jpg’, ’54KB’, ‘2021-12-19’) cursor.executemany (‘ ВСТАВИТЬ В изображения (имя, размер, дата) ЗНАЧЕНИЯ (?,?,?) ‘, Значения)
Как установить PyMySQL?
Прежде чем продолжить, убедитесь, что на вашем компьютере установлен PyMySQL. Просто вставьте следующее в свой скрипт Python и запустите его —
#! / usr / bin / python3import pymysql
Если это дает следующий результат, это означает, что модуль MySQLdb не установлен —
Traceback (последний последний вызов): файл «test.py», строка 3, в Импортировать pymysql ImportError: нет модуля с именем pymysql
Последняя стабильная версия доступна на PyPI и может быть установлена с помощью pip —
pip установить pymysql
В качестве альтернативы (например, если pip недоступен), tarball можно загрузить с GitHub и установить вместе с Setuptools следующим образом:
$ # XX — это желаемая версия pymysql (например, 0.5 или 0.6). $ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-XX | tar xz $ cd PyMySQL * $ python setup.py install $ # Теперь папку PyMySQL * можно безопасно удалить.
Примечание. Убедитесь, что у вас есть права суперпользователя для установки указанного выше модуля.
Доступ к коду SQL
Большинство поддерживаемых баз данных являются реляционными, поэтому pyDAL работает с внутренним построением и выполнением SQL-запросов в реальном времени.
Атрибут db._lastsql содержит последний выполненный запрос, например:
>>> people = db (db.person.age> 18) .select () >>> db._lastsql (‘SELECT «person». «id», «person». «name», «person». «age» «ОТ» человека «ГДЕ (» человек «.» Возраст «> 18); ‘, 0,0) Язык кода: JavaScript (javascript)
Возвращает кортеж, содержащий запрос и время, затраченное на его выполнение.
Чтобы узнать SQL, сгенерированный определенной операцией, не выполняя ее сначала, pyDAL предоставляет функции _select, _insert, _update и _delete.
>>> db (db.person.age> 18) ._ select () ‘ВЫБРАТЬ «человека». «id», «человек». «имя», «лицо». «возраст» ОТ «человека» ГДЕ («человек». «возраст»> 18); ‘Язык кода: JavaScript (javascript)
Эти методы также можно вызывать без необходимости устанавливать реальное соединение с базой данных, используя do_connect = False.
db = DAL («sqlite: //storage.db», do_connect = False) Язык кода: PHP (php)
Создайте объект курсора
Как только соединение установлено, у нас есть объект соединения, из которого мы можем построить объект Cursor .
# Создаем курсор в базе данных c = conn.cursor()
Этот курсор является указателем на базу данных, которая используется для навигации по ней, чтобы вы могли перемещаться по местам и выполнять SQL-запросы.
Подробнее об определениях
При определении полей в таблице Field предоставляет несколько аргументов для реализации решений, которые обычно возникают при работе с базами данных.
Например, мы можем указать значение по умолчанию для поля, когда мы вызываем insert():
# Необязательное поле со значением по умолчанию. Поле («age», type = «integer», по умолчанию = 18) Язык кода: PHP (php)
Настройка по умолчанию действительна только при вводе информации. Для обновления через update () используйте параметр update.
# Значение по умолчанию для insert () и update (). Поле («возраст», тип = «целое число», по умолчанию = 18, обновление = 18) Язык кода: PHP (php)
Заставляет пользователя всегда указывать свое значение, в противном случае генерируется исключение.
# Обязательное поле. Поле («age», type = «integer», обязательное = True) Язык кода: PHP (php)
Для:
>>> db.person.insert (name = «Paul») Traceback (последний самый последний вызов):… RuntimeError: Table: отсутствует обязательное поле: ageCode язык: JavaScript (javascript)
Для полей типа «строка», «пароль» и «загрузка» желательно указать параметр длины, который указывает максимальную длину.
# Максимум 50 символов. Поле («имя», длина = 50) Язык кода: PHP (php)
Это упрощает миграцию между разными базами данных и предотвращает их возможную потерю.
Параметры filter_in и filter_out принимают функции для обработки данных до того, как они поступят, и после того, как они вернутся из базы данных, соответственно.
Например, в следующем коде первая буква имени заглавная.
def capitalize (name): return name.capitalize () db.define_table («person», Field («name», length = 50, filter_in = capitalize), Field («age», type = «integer»)) код: JavaScript (javascript)
Нравится:
# Вставить «Паоло» db.person.insert (name = «pavel») Язык кода: PHP (php)
filter_out работает аналогично:
def upper (name): return name.upper () db.define_table («person», Field («name», length = 50, filter_in = capitalize, filter_out = upper), Field («age», type = «integer»))) # Получить первую строку, имя которой «Василий» row = db (db.person.name == «Vasily») select () first () print (row.name) # Вывести «Василий» Код языка: PHP (PHP)
Проверка является ли переменная строковой в Python
Подключение к базе данных
Перед подключением к базе данных MySQL убедитесь в следующем:
- Вы создали базу данных TESTDB.
- Вы создали таблицу EMPLOYEE в TESTDB.
- Эта таблица содержит поля FIRST_NAME, LAST_NAME, AGE, SEX и INCOME.
- Идентификатор пользователя testuser и пароль test123 установлены для входа в TESTDB.
- Модуль Python PyMySQL правильно установлен на вашем компьютере.
- Вы следовали руководству MySQL, чтобы понять основы MySQL.
Вы создали базу данных TESTDB.
Вы создали таблицу EMPLOYEE в TESTDB.
Эта таблица содержит поля FIRST_NAME, LAST_NAME, AGE, SEX и INCOME.
Идентификатор пользователя testuser и пароль test123 установлены для входа в TESTDB.
Модуль Python PyMySQL правильно установлен на вашем компьютере.
Вы следовали руководству MySQL, чтобы понять основы MySQL.
пример
Ниже приведен пример подключения к базе данных MySQL «TESTDB» —
#! / usr / bin / python3import pymysql # Открыть соединение с базой данных db = pymysql.connect («localhost», «testuser», «test123», «TESTDB») # подготовить объект курсора с помощью метода cursor () cursor = db cursor () # выполнить SQL-запрос с помощью метода execute () cursor.execute («SELECT VERSION ()») # Получить одну строку с помощью метода fetchone () data = cursor.fetchone () print («версия базы данных:% s» % data) # отключиться от сервера db.close()
Когда вы запускаете этот сценарий, он дает следующий результат.
Версия базы данных: 5.5.20-log
Если соединение с источником данных установлено, объект соединения возвращается и сохраняется в базе данных для дальнейшего использования, в противном случае для базы данных устанавливается значение «Нет». Затем объект db используется для создания объекта курсора, который, в свою очередь, используется для выполнения SQL-запросов. Наконец, перед выходом убедитесь, что соединение с базой данных закрыто и ресурсы освобождены.
Создание таблицы базы данных
Как только соединение с базой данных установлено, мы готовы создавать таблицы или записи в таблицах базы данных, используя созданный метод выполнения курсора.
пример
Создадим таблицу базы данных EMPLOYEE —
#! / usr / bin / python3import pymysql # Открыть соединение с базой данных db = pymysql.connect («localhost», «testuser», «test123», «TESTDB») # подготовить объект курсора с помощью метода cursor () cursor = db cursor () # Удалите таблицу, если она уже существует, с помощью метода execute () cursor.execute («DROP TABLE IF EXISTS EMPLOYEE») # Создайте таблицу в соответствии с требованием sql = «» «CREATE TABLE EMPLOYEE (FIRST_NAME CHAR (20) NOT NULL, LAST_NAME CHAR (20), AGE INT, SEX CHAR (1), INCOME FLOAT) «» «cursor.execute (sql) # отключиться от сервера db.close()
Выполнение SQL-запросов с помощью PyQt
Имея полнофункциональное соединение с базой данных, вы готовы приступить к работе с базой данных. Для этого можно использовать строковые запросы SQL и объекты QSqlQuery <>. QSqlQuery позволяет выполнять любой SQL-запрос в вашей базе данных. С помощью QSqlQuery вы можете выполнять операторы языка обработки данных (DML), такие как SELECT, INSERT, UPDATE и DELETE, а также операторы языка определения данных (DDL), такие как CREATE TABLE и т.д.
Конструктор QSqlQuery имеет несколько вариантов, но в этом руководстве вы изучите два:
- 1. QSqlQuery (запрос, соединение) создает объект запроса, используя SQL-запрос типа строка и соединение с базой данных. Если соединение не указано или если указанное соединение недействительно, используется соединение с базой данных по умолчанию. Если запрос не является пустой строкой, он будет выполнен немедленно.
- 2. QSqlQuery (соединение) создает тему запроса, используя соединение. Если соединение недействительно, используется соединение по умолчанию.
вы также можете создавать объекты QSqlQuery без передачи каких-либо аргументов конструктору. В этом случае запрос будет использовать соединение с базой данных по умолчанию, если таковое имеется.
Чтобы выполнить запрос, вам нужно вызвать .exec () для объекта запроса. Вы можете использовать .exec () двумя способами:
- 1..exec (query) выполняет строковый запрос SQL, содержащийся в запросе. Возвращает True, если запрос был успешным, и False, если нет.
- 2..exec () выполняет заранее подготовленный оператор SQL. Возвращает True, если запрос был успешным, и False, если нет.
Примечание. PyQt также реализует варианты QSqlQuery.exec () с именем .exec_ (). Они обеспечивают совместимость с предыдущими версиями Python, где exec было ключевым словом языка.
Теперь, когда вы знаете основы использования QSqlQuery для построения и выполнения SQL-запросов, вы готовы применить свои знания на практике.
Открытие соединения с базой данных
После того, как у вас есть соединение с базой данных, вам необходимо открыть это соединение, чтобы взаимодействовать с вашей базой данных. Для этого вы вызываете функцию .open () в объекте .open (), у нее есть два следующих варианта:
- 1 open () открывает соединение с базой данных, используя текущие значения соединения.
- 2.open (имя пользователя, пароль) открывает соединение с базой данных, используя указанные имя пользователя и пароль.
Оба параметра возвращают значение True, если соединение установлено успешно. В противном случае они возвращают False. Если соединение не удается, вы можете вызвать .lastError (), чтобы получить информацию о том, что произошло. Эта функция возвращает информацию о последней ошибке, о которой сообщает база данных.
Примечание. Как вы уже узнали, .SetPassword (пароль) хранит пароли в виде обычного текста, что создает угрозу безопасности. С другой стороны, .open () вообще не хранит пароли. Он передает пароль непосредственно водителю при открытии соединения. Затем сбросьте свой пароль. Следовательно, использование .open () для управления паролями — правильный способ избежать проблем с безопасностью.
Вот пример того, как открыть соединение с базой данных SQLite, используя первую опцию .open():
>>> from PyQt5.QtSql import QSqlDatabase >>> # Создать соединение >>> con = QSqlDatabase.addDatabase («QSQLITE») >>> con.setDatabaseName («contacts.sqlite») >>> # Открыть соединение> >> con.open () Истина >>> con.isOpen () Истина
В предыдущем примере сначала создается соединение с базой данных SQLite и открывается это соединение с помощью функции .open (). Поскольку .open () возвращает True, соединение успешно. На этом этапе вы можете проверить соединение с помощью функции .isOpen (), которая возвращает True, если соединение открыто, и False в противном случае.
Примечание. Если вы вызываете .open () для соединения с помощью драйвера SQLite, а файл базы данных не существует, новый пустой файл базы данных будет создан автоматически.
В реальных приложениях вам необходимо убедиться, что у вас есть действующее соединение с базой данных, прежде чем пытаться выполнять какие-либо операции с данными. В противном случае приложение может сломаться и вылететь. Например, что, если у вас нет прав на запись в каталог, в котором вы пытаетесь создать этот файл базы данных? Вам необходимо убедиться, что вы обрабатываете любые ошибки, которые могут возникнуть при открытии соединения.
Распространенный способ вызова функции .open () — заключить ее в условный оператор. Это позволяет обрабатывать ошибки, которые могут возникнуть при открытии соединения:
>>> import sys >>> from PyQt5.QtSql import QSqlDatabase >>> # Создать соединение >>> con = QSqlDatabase.addDatabase («QSQLITE») >>> con.setDatabaseName («contacts.sqlite») >>> # Открывать соединение и обрабатывать ошибки >>> если не con.open (): . print («Не удалось подключиться к базе данных») . sys.exit (1)
Заключение вызова функции .open () в условный оператор позволяет обрабатывать любые ошибки, возникающие при открытии соединения. Таким образом, вы можете сообщить своим пользователям о любых проблемах перед запуском приложения. Обратите внимание, что приложение заканчивается статусом выхода 1, обычно используемым для обозначения ошибки программы.
В приведенном выше примере вы используете .open () в интерактивном сеансе, поэтому вы используете print () для представления пользователям сообщений об ошибках. Однако в графических приложениях объект QMessageBox обычно используется вместо print (). С QMessageBox вы можете создавать небольшие диалоговые окна для представления информации вашим пользователям.
Вот пример графического интерфейса приложения, показывающий, как обрабатывать ошибки подключения:
import sys from PyQt5.QtSql import QSqlDatabase from PyQt5.QtWidgets import QApplication, QMessageBox, QLabel # Создать соединение с = QSqlDatabase.addDatabase («QSQLITE») con.setDatabaseName («/ home /contacts.sqlite =») # Создать приложение QApplication (sys.argv) # Попробуйте открыть соединение и обработать любые ошибки, если не с помощью .open (): QMessageBox.critical (None, «Имя приложения — Ошибка!», «Ошибка базы данных:% s»% con.lastError () .databaseText (),) sys.exit (1) # Создать окно приложения win = QLabel («Соединение успешно открыто!») win.setWindowTitle («Имя приложения») win.resize (200, 100) win.show () sys .exit (app.exec_())
Оператор if в строке 14 проверяет, не удалось ли установить соединение. Если каталог / home / не существует или у вас нет разрешения на запись в него, вызов функции .open () завершится ошибкой, потому что файл базы данных не может быть создан. В этой ситуации поток выполнения входит в блок кода оператора if и отображает сообщение на экране.
Если вы измените путь к любому другому каталогу, в который вы можете писать, вызов функции .open () будет успешным, и вы увидите окно с сообщением «Соединение успешно открыто! У вас также будет новый файл базы данных с именем contact.sqlite в выбранном вами каталоге.
Обратите внимание, что вы передаете None в качестве родителя сообщения, потому что к моменту отображения сообщения вы еще не создали окно, поэтому у вас нет допустимого родителя для окна сообщения.
Транзакции
В реляционных базах данных действует принцип ACID. Не вдаваясь в технические детали, он объясняет, как должны работать транзакции. Сама транзакция — это один или несколько запросов, которые выполняются вместе. Эти запросы могут быть успешно выполнены или отменены вместе. Простым примером являются 2 таблицы, в которые вводятся данные. Если ошибка возникает в 1 таблице, операцию во 2-й таблице необходимо отменить.
Условия успешного выполнения транзакций может установить сам разработчик. Транзакции совершаются с помощью метода commit () и откатываются с помощью rollback().
Если вы успешно закроете соединение с базой данных (с помощью диспетчера контекста или метода .close ()), все ожидающие запросы будут сохранены. При возникновении ошибки (например, аварийное выключение компьютера) для успешного завершения транзакций должен работать один из принципов ACID, но также может произойти откат.
В следующем примере мы создадим 2 подключения к базе данных, и в одном из них данные не будут записаны в базу данных из-за отсутствия commit():
import sqlite3 from contextlib import close database = ‘database.db’ # функция для отображения данных из таблицы def show_table (db_con): cursor = db_con.cursor () cursor.execute (‘выберите имя, размер, дату из изображений;’) имя, размер, дата в cursor.fetchall (): print (name, size, date) with close (sqlite3.connect (database)) as db_con: print (‘Таблица перед добавлением данных:’) show_table (db_con) cursor1 = db_con .cursor () # создать транзакцию cursor1.execute («» «вставить в изображения (имя, размер, дата) значения (‘pic3.jph’, ’10KB’, ‘2021-03-10’);» «») print (‘Данные с текущим подключением и без завершения транзакции:’) show_table (db_con) print (‘Данные с новым подключением и без завершения транзакции:’) с sqlite3.connect (база данных) как db_con2: show_table (db_con2) # Зафиксировать db_con .commit () print («Данные о новом соединении и транзакции завершены:») с sqlite3.connect (база данных) как db_con3: show_table (db_con3)
откат работает наоборот. Те данные, которые были созданы в первом запросе на вставку, будут полностью удалены из базы данных. Транзакция может быть завершена или отменена. Невозможно выполнить первое, потом второе и наоборот.
Лучше всего явно закрывать каждое соединение и транзакцию:
timeout транзакции
Если транзакция не закрыта, таблица будет заблокирована (также зависит от типа используемой транзакции). Как долго эта транзакция будет оставаться в этой форме, зависит от параметра «тайм-аут». Устанавливается при подключении:
sqlite3.connect (база данных, тайм-аут = 5)
По умолчанию это значение равно 5.
ВСТАВИТЬ Операция
Операция INSERT требуется, если вы хотите создать записи в таблице базы данных.
пример
В следующем примере выполняется инструкция SQL INSERT для создания записи в таблице EMPLOYEE —
#! / usr / bin / python3import pymysql # Откройте соединение с базой данных db = pymysql.connect («localhost», «testuser», «test123», «TESTDB») # подготовьте объект курсора с помощью метода cursor () cursor = db. () # Подготовьте SQL-запрос для ВСТАВКИ записи в базу данных sql = «» «INSERT INTO EMPLOYEE (FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES (‘Mac’, ‘Mohan’, 20, ‘M’, 2000) «» «try: # Выполнить SQL cursor.execute (sql) # Подтвердить изменения в базе данных db.commit () за исключением: # Откат при ошибке db.rollback () # отключиться от сервера db.close()
Приведенный выше пример можно написать так, чтобы динамически строить SQL-запросы:
#! / usr / bin / python3import pymysql # Открыть соединение с базой данных db = pymysql.connect («localhost», «testuser», «test123», «TESTDB») # подготовить объект курсора с помощью метода cursor () cursor = db cursor () # Подготовьте SQL-запрос для ВСТАВКИ записи в базу данных sql = «INSERT INTO EMPLOYEE (FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES (‘% s’, ‘% s’, ‘% d’, ‘ % c ‘,’% d ‘) «% (‘ Mac ‘,’ Mohan ‘, 20,’ M ‘, 2000) try: # Выполнить команду SQL cursor.execute (sql) # Подтвердить изменения в базе данных db .commit () кроме: # Откат при ошибке db.rollback () # отключение от сервера db.close()
Ссылка на уже существующую таблицу
pyDAL в первую очередь предназначен для работы с самосозданными таблицами, но он также поддерживает привязку к уже существующим таблицам (с некоторыми ограничениями).
Оба выполняются с помощью define_table().
Когда мы вызываем define_table (), pyDAL создаст таблицу, если она не существует.
Если он существует, определенные поля по умолчанию проверяются на соответствие существующим.
Если структура таблицы в базе данных отличается от указанной, пакет автоматически вносит соответствующие изменения (в механизмах SQL с помощью команды ALTER TABLE).
Все эти автоматические операции, которые модуль выполняет с базой данных, называются миграциями.
Если мы хотим связать pyDAL с существующей таблицей, рекомендуется отключить миграции с помощью migrate = False.
Другое требование — каждая таблица должна иметь первичный ключ для идентификации каждой строки, иначе pyDAL не сможет установить связь.
Если, например, структура нашей существующей таблицы выглядит так:
СОЗДАТЬ ТАБЛИЦУ «person» («person_id» INTEGER PRIMARY KEY AUTOINCREMENT, «name» CHAR (512), INTEGER «age») Язык кода: JavaScript (javascript)
Его определение в pyDAL будет выглядеть так::
# Ссылка на существующую таблицу db.define_table («person», # Укажите pyDAL, который является первичным ключом. Поле («person_id», type = «id»), Поле («имя»), Поле («возраст», type = «integer»), # Отключить миграцию. Migrate = False) Язык кода: PHP (php)
Включение записей
Давайте вставим несколько записей во вновь созданную таблицу USER, чтобы доказать, что она действительно была создана.
Предположим, мы хотим вставить несколько записей одновременно. Выполняем:
sql = ‘INSERT INTO USER (id, name, age) values (?,?,?)’ data = (1, ‘Alice’, 21), (2, ‘Bob’, 22), (3, ‘Христос’, 23)
Определить оператор SQL с вопросительными знаками? как заполнитель. Теперь давайте создадим образцы данных для вставки, а затем вставим их с помощью объекта подключения:
с минусами:
con.executemany (sql, данные)
После запуска кода предупреждений не было, значит, все было нормально.
Типы данных SQLite в Python
SQLite для Python предлагает меньше типов данных, чем другие реализации SQL. С одной стороны, это накладывает ограничения, но с другой стороны, в SQLite многое упрощается. Основные виды:
- NULL — значение NULL
- ЦЕЛОЕ — целое
- REAL — число с плавающей запятой
- ТЕКСТ — текст
- BLOB — двоичное представление больших объектов, хранящееся точно в том виде, в котором они были вставлены
К сожалению, в SQLite нет других типов данных, знакомых с SQL.