Сегодня поговорим о том, как воспользоваться PyMySQL модулем, чтобы использовать MySQL в Python.
Примеры использования PyMySQL
PyMySQL – это в определенной степени уникальная библиотека, которая работает на основе PEP 249. Подавляющее количество общедоступных API совместимы с mysqlclient и MySQLdb. PyMySQL совместим с MySQL 5.5+ и MariaDB 5.5+.
На данный момент альтернатив MySQL среди систем управления базами данных с открытым исходным кодом нет. Это система поддерживает большое количество пользователей и потоков, что делает ее особо популярной среди программистов.
Установка PyMySQL
Чтобы установить этот модуль, необходимо ввести следующую команду в терминале.
$ sudo pip3 install PyMySQL
Естественно, чтобы была возможность установить PyMySQL, требуется pip3.
Как узнать версию MySQL с помощью PyMySQL?
В этом примере видно, как узнать текущую версию MySQL.
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect('localhost', 'user17', 's$cret', 'mydb') with con: cur = con.cursor() cur.execute("SELECT VERSION()") version = cur.fetchone() print("Database version: {}".format(version[0]))
Чтобы узнать версию MySQL, можно также воспользоваться командой SELECT VERSION().
import pymysql
Для этого понадобится импортировать pymysql модуль.
con = pymysql.connect('localhost', 'user17', 's$cret', 'mydb')
Потом производится подключение к базе данных с помощью connect(). Здесь надо ввести четыре параметра.
- Имя хоста.
- Имя пользователя.
- Пароль.
- Название базы данных.
with con:
С помощью with интерпретатор Python автоматически откроет доступные ресурсы. Он также производит обработку возможных исключений.
cur = con.cursor()
С помощью объекта подключения con создается курсор. Он используется для перемещения записей из набора результатов.
cur.execute("SELECT VERSION()")
Для использования команды SQL осуществляется вызов метода курсора execute().
version = cur.fetchone()
Метод fetchone() дает возможность вызвать следующую строку из набора результатов запроса, показывая лишь одну запись. В том случае, если доступные сведения отсутствуют, выводится None.
print("Database version: {}".format(version[0]))
Следовательно, версия базы данных отображается на экране.
$ ./version.py Database version: 5.7.23-0ubuntu0.16.04.1
Это результат вывода.
PyMySQL fetchAll
С помощью метода fetchAll() дает возможность получить все строки результата запроса, которые остались, возвращая их в виде последовательности последовательностей. Звучит сложно, но после того, как вы посмотрите на этот пример, станет понятнее.
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect('localhost', 'user17', 's$cret', 'testdb') with con: cur = con.cursor() cur.execute("SELECT * FROM cities") rows = cur.fetchall() for row in rows: print("{0} {1} {2}".format(row[0], row[1], row[2]))
Обратите внимание, что в этом примере из таблицы базы данных выводятся все города.
cur.execute("SELECT * FROM cities")
Этот оператор выбирает все данные из таблицы cities.
rows = cur.fetchall()
Метод fetchall() дает возможность получить все записи. Он возвращает набор результатов. По факту, это кортеж, элементами которого являются другие кортежи. Каждый из внутренних кортежей являет собой отдельную строку в таблице.
for row in rows: print("{0} {1} {2}".format(row[0], row[1], row[2]))
Данные выводятся в консоль строка за строкой.
$ ./retrieve_all.py 1 Bratislava 432000 2 Budapest 1759000 3 Prague 1280000 4 Warsaw 1748000 5 Los Angeles 3971000 6 New York 8550000 7 Edinburgh 464000 8 Berlin 3671000
Именно такие результаты будут отображены после того, как запустить приведенный выше код.
PyMySQL словарь курсора
По умолчанию курсор возвращает данные в кортеж из кортежей. Если используется словарь курсора, данные отправляются в форму, которая используется Python-словарями. В этом случае появляется возможность обращения к данным посредством названий их колонок.
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql import pymysql.cursors con = pymysql.connect(host='localhost', user='user17', password='s$cret', db='mydb', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) with con: cur = con.cursor() cur.execute("SELECT * FROM cities") rows = cur.fetchall() for row in rows: print(row["id"], row["name"])
В этом примере демонстрируется, как получить первые строки таблицы cities, используя словарь курсора.
con = pymysql.connect(host='localhost', user='user17', password='s$cret', db='mydb', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
А с помощью метода connect() передается значение pymysql.cursors.DictCursor параметру cursorclass.
for row in rows: print(row["id"], row["name"])
Обращение к данным осуществляется с помощью названий колонок таблицы cities.
PyMySQL – заголовки колонок
Теперь мы разберемся, что делать для отображения названий колонок с данными из таблицы базы данных.
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect('localhost', 'user17', 's$cret', 'testdb') with con: cur = con.cursor() cur.execute("SELECT * FROM cities") rows = cur.fetchall() desc = cur.description print("{0:>3} {1:>10}".format(desc[0][0], desc[1][0])) for row in rows: print("{0:3} {1:>10}".format(row[0], row[2]))
Названия колонок являют собой метаданные. Они извлекаются из объекта курсора.
desc = cur.description
Далее, с помощью атрибута курсора description возвращаются данные о каждом результативном столбце.
print("{0:>3} {1:>10}".format(desc[0][0], desc[1][0]))
В результате, выводятся и форматируются названия колонок.
for row in rows: print("{0:3} {1:>10}".format(row[0], row[2]))
Ну и, наконец, происходит перебор и вывод на экран данных с использованием цикла for.
$ ./column_headers.py id name 1 432000 2 1759000 3 1280000 4 1748000 5 3971000 6 8550000 7 464000 8 3671000
В результате выполнения всех приведенных выше действий получаем следующий результат.
PyMySQL – связываемые переменные
При написании связываемых переменных вместо того, чтобы непосредственно указывать значения, необходимо задействовать специальные плейсхолдеры. Связываемые переменные дают возможность сделать приложение более безопасным и производительным.
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect('localhost', 'user17', 's$cret', 'testdb') # user input myid = 4 with con: cur = con.cursor() cur.execute("SELECT * FROM cities WHERE id=%s", myid) cid, name, population = cur.fetchone() print(cid, name, population)
В этом примере отображается, как получить строку с определенным id.
cur.execute("SELECT * FROM cities WHERE id=%s", myid)
Здесь применяется плейсхолдер, идентифицируемый с использованием маркера %s. Перед тем, как определенная переменная SQL будет использоваться, она должна быть привязана к плейсхолдеру.
$ ./prepared_statement.py 4 Warsaw 1748000
В результате, будет выведено значение, указанное выше.
Задействованные строки в PyMySQL
Атрибут rowcount, который может использоваться исключительно для чтения, показывает количество строк, которые были получены как следствие использования оператора SELECT, UPDATE, INSERT.
Приведем пример кода, который демонстрирует это наглядно.
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect('localhost', 'user17', 's$cret', 'mydb') with con: cur = con.cursor() cur.execute("SELECT * FROM cities WHERE id IN (1, 2, 3)") # rows = cur.fetchall() # for row in rows: # print("{0} {1} {2}".format(row[0], row[1], row[2])) print("The query affected {} rows".format(cur.rowcount))
В этом примере отображается, что оператор SELECT, который использовался выше, выбирает три строки.
print("The query affected {} rows".format(cur.rowcount))
Проще говоря, составляется сообщение, где отображается количество строк, которые были задействованы.
$ ./affected_rows.py The query affected 3 rows
Это то, что было отображено в выводе приложения.
На этом рассмотрение работы с SQL с использованием этой библиотеки Python подходит к концу.