Работа с MySQL в Python

Ранее я уже писал статью про работу с PostgreSQL из Python. Сегодняшний пост будет посвящен другой популярной базе данных MySQL. Мой путь в веб-программирование был классическим: PHP, MySQL и Apache. Среди php-разработчиков MySQL пользуется большей популярностью чем PostgreSQL, хотя последняя предоставляет функционал намного богаче. MySQL до сих пор остаётся лидером среди реляционных open source баз данных, поэтому давайте узнаем как с ней работать через Python.

Установка

В статье речь пойдёт про пакет PyMySQL, это реализация mysql-клиента на чистом Python, поэтому никакие дополнительный Си-библиотеки ставить не придётся. Пакет поддерживает работу с Python 2.7 и Python >= 3.5.

Для установки библиотеки выполняем стандартную команду:

pip install PyMySQL

Начало работы

Соединиться с базой можно вот так:

import pymysql
from pymysql.cursors import DictCursor

connection = pymysql.connect(
    host='localhost',
    user='user',
    password='password',
    db='iata',
    charset='utf8mb4',
    cursorclass=DictCursor
)
...
connection.close()

Обратите внимание, что я импортировал класс DictCursor и передал его в вызов функции connect, это нужно для того, чтобы получить результат в виде словаря, где ключами будут названия колонок. Если вам удобно работать с tuple, то ничего не передавайте в cursorclass

Рекомендуется всегда явно закрывать открытое с базой MySQL соединение, путём вызова метода close у объекта connection. Чаще всего разработчики прибегают к конструкции try/finally, но я использую closing из contextlib. Вот как это выглядит:

from contextlib import closing

import pymysql
from pymysql.cursors import DictCursor

with closing(pymysql.connect(...)) as connection:
    ...

В этом случае при выходе из контекстного блока автоматически будет вызван метод close. Чтобы начать взаимодействие с MySQL, необходимо создать курсор:

with closing(pymysql.connect(...)) as connection:
    with connection.cursor() as cursor:

        query = """
        SELECT
            airport_code
        FROM
            airports
        ORDER BY 
            airport_code DESC
        LIMIT 5
        """

        cursor.execute(query)

        for row in cursor:
            print(row)

{'airport_code': 'ZZW'}
{'airport_code': 'ZZU'}
{'airport_code': 'ZZO'}
{'airport_code': 'ZZG'}
{'airport_code': 'ZYR'}

Пишем в базу

А вот как выглядит INSERT в простенькую таблицу с одной колонкой. Описание схемы таблицы следующее:

CREATE TABLE IF NOT EXISTS tweets (
    tweet VARCHAR(254)
)  ENGINE=INNODB;

А вот код вставки и чтения результата операции

with closing(pymysql.connect(...)) as conn: with conn.cursor() as cursor: tweets = [ 'Hello world!', 'I love Python & MySQL', 'Let\'s start programming ASAP', 'Python is the coolest programming language' ] query = 'INSERT INTO tweets (tweet) VALUES (%s)' cursor.executemany(query, tweets) # необходимо, т.к. по-умолчанию commit происходит только после выхода # из контекстного менеджера иначе мы бы не увидели твиттов conn.commit() with conn.cursor() as cursor: query = 'SELECT tweet FROM tweets' cursor.execute(query) for row in cursor: print(row['tweet'])

В выполнения кода получим следующий результат

Hello world!
I love Python & MySQL
Let's start programming ASAP
Python is the coolest programming language
Подписывайтесь на мой телеграм-канал  DevBrain, чтобы не пропустить интересное из мира разработки.