PyMySQL — инструкция по использованию MySQL на примерах

Сегодня поговорим о том, как воспользоваться 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(). Здесь надо ввести четыре параметра.

  1. Имя хоста.
  2. Имя пользователя.
  3. Пароль.
  4. Название базы данных.

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 подходит к концу.

ОфисГуру
Adblock
detector