PyMySQL – драйвер для MySQL

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

MySQL — одна из самых популярных реляционных баз данных, широко используемая в веб-разработке и корпоративных решениях. Для работы с MySQL в Python часто используется драйвер PyMySQL — чисто Python-реализация протокола MySQL. Он прост в использовании, активно поддерживается и совместим с популярными библиотеками, такими как SQLAlchemy и Pandas.

PyMySQL – драйвер для MySQL позволяет подключаться к базе, выполнять SQL-запросы, управлять транзакциями и интегрироваться с веб-фреймворками без сложной настройки.

Установка и подключение к MySQL

Установка

bash
pip install pymysql

Подключение к базе данных

python
import pymysql connection = pymysql.connect( host='localhost', user='root', password='password', database='test_db', cursorclass=pymysql.cursors.DictCursor )

DictCursor позволяет получать результаты в виде словарей, а не кортежей.

Создание базы данных и таблиц

python
with connection.cursor() as cursor: cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100))") connection.commit()

CRUD-операции с PyMySQL

Вставка данных

python
with connection.cursor() as cursor: sql = "INSERT INTO users (name, email) VALUES (%s, %s)" cursor.execute(sql, ("Иван", "ivan@example.com")) connection.commit()

Чтение данных

python
with connection.cursor() as cursor: cursor.execute("SELECT * FROM users") result = cursor.fetchall() for user in result: print(user)

Обновление и удаление

python
cursor.execute("UPDATE users SET email = %s WHERE id = %s", ("new@example.com", 1)) cursor.execute("DELETE FROM users WHERE id = %s", (1,))

Использование курсора и управление транзакциями

  • cursor() — создаёт объект курсора

  • commit() — сохраняет изменения

  • rollback() — откатывает транзакцию

python
try: with connection.cursor() as cursor: cursor.execute("...") connection.commit() except Exception: connection.rollback()

Обработка результатов запросов

Методы:

  • fetchone() — одна строка

  • fetchall() — список всех строк

  • fetchmany(n) — первые n строк

Безопасность и защита от SQL-инъекций

PyMySQL поддерживает параметризацию:

python
cursor.execute("SELECT * FROM users WHERE email = %s", ("ivan@example.com",))

Нельзя использовать форматирование строк — это уязвимо к SQL-инъекциям.

Работа с датами и временем

python
from datetime import datetime now = datetime.now() cursor.execute("INSERT INTO logs (event_time) VALUES (%s)", (now,))

Интеграция с Pandas и другими библиотеками

python
import pandas as pd import sqlalchemy engine = sqlalchemy.create_engine("mysql+pymysql://root:password@localhost/test_db") df = pd.read_sql("SELECT * FROM users", engine) df.to_sql("users_copy", con=engine, if_exists="replace", index=False)

Асинхронная работа и совместимость

PyMySQL — синхронная библиотека. Для асинхронной работы используйте aiomysql или asyncmy. В SQLAlchemy есть поддержка async с PyMySQL-подобными драйверами.

Интеграция с Flask, Django, FastAPI

Flask

python
from flask import Flask import pymysql app = Flask(__name__) @app.route('/') def home(): connection = pymysql.connect(...) with connection.cursor() as cursor: cursor.execute("SELECT * FROM users") return str(cursor.fetchall())

Django

В settings.py:

python
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test_db', 'USER': 'root', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '3306', } }

FastAPI

Используется через SQLAlchemy + PyMySQL:

python
from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:password@localhost/test_db")

Обработка ошибок и исключений

python
from pymysql.err import OperationalError, IntegrityError try: ... except OperationalError: print("Ошибка соединения") except IntegrityError: print("Нарушение ограничений")

Сравнение с другими драйверами

Драйвер Язык Асинхронность Установка Поддержка SQLAlchemy
PyMySQL Python Нет Легко Да
mysqlclient C/Python Нет Сложнее Да
MySQL Connector Python Нет Легко Да
aiomysql Python Да Средне Нет

Тестирование с PyMySQL

  • Используйте отдельную тест-базу

  • Очищайте таблицы в setup/teardown

  • Используйте SQLite как замену в CI при необходимости

Часто задаваемые вопросы (FAQ)

1. Что такое PyMySQL?
Это чисто Python-драйвер для подключения к MySQL-серверу.

2. Поддерживает ли PyMySQL асинхронность?
Нет, для этого используют aiomysql или asyncmy.

3. Можно ли использовать PyMySQL с SQLAlchemy?
Да, указывается как mysql+pymysql в строке подключения.

4. Как защититься от SQL-инъекций?
Всегда используйте параметризацию через %s.

5. Работает ли PyMySQL в Django?
Да, используется через django.db.backends.mysql.

6. Есть ли альтернатива PyMySQL?
Да: mysqlclient, MySQL Connector, aiomysql (async).

Полный справочник по ключевым функциям и модулям библиотеки PyMySQL для Python

Установка

bash
pip install pymysql

Подключение к базе данных

Функция / Метод Описание
pymysql.connect(...) Создает соединение с MySQL.
python
import pymysql conn = pymysql.connect( host="localhost", user="root", password="password", database="test_db", port=3306, charset="utf8mb4" ) cursor = conn.cursor()

Выполнение SQL-запросов

Метод Описание
cursor.execute(query, params) Выполняет одиночный SQL-запрос.
cursor.executemany(query, param_list) Выполняет несколько запросов.
cursor.fetchall() Возвращает все строки результата.
cursor.fetchone() Возвращает одну строку.
cursor.fetchmany(size) Возвращает size строк.
python
cursor.execute("SELECT * FROM users WHERE age > %s", (18,)) rows = cursor.fetchall()

Параметры запроса

Формат Пример
%s Безопасный плейсхолдер
cursor.execute("INSERT INTO users (name) VALUES (%s)", ("Ваня",)) Передача параметров

Коммит и откат транзакций

Метод Описание
conn.commit() Подтверждение изменений.
conn.rollback() Откат изменений.
python
conn.commit() conn.rollback()

Закрытие соединений

Метод Описание
cursor.close() Закрывает курсор.
conn.close() Закрывает соединение.

Создание и удаление таблиц

python
cursor.execute(""" CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), age INT ) """) cursor.execute("DROP TABLE IF EXISTS users")

Вставка, обновление и удаление данных

python
# Вставка cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Оля", 25)) # Обновление cursor.execute("UPDATE users SET age = %s WHERE name = %s", (26, "Оля")) # Удаление cursor.execute("DELETE FROM users WHERE name = %s", ("Оля",))

Обработка ошибок

Исключение Описание
pymysql.MySQLError Базовое исключение.
pymysql.OperationalError Ошибки соединения.
pymysql.ProgrammingError Ошибки в SQL-запросе.
python
try: cursor.execute("SELECT * FROM missing_table") except pymysql.MySQLError as e: print("Ошибка:", e)

Использование с with (контекстный менеджер)

python
with conn.cursor() as cursor: cursor.execute("SELECT * FROM users") print(cursor.fetchall())

Использование с pandas

python
import pandas as pd df = pd.read_sql("SELECT * FROM users", conn)

Использование с SQLAlchemy

python
from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:password@localhost/test_db")

Дополнительные параметры подключения

Параметр Описание
autocommit=True Включить автокоммит.
cursorclass=pymysql.cursors.DictCursor Результаты в виде словарей.
ssl={"ssl": {}} Использование SSL.

Пример полного взаимодействия

python
import pymysql conn = pymysql.connect(host="localhost", user="root", password="1234", database="test_db") cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50))") cursor.execute("INSERT INTO test (name) VALUES (%s)", ("Ваня",)) conn.commit() cursor.execute("SELECT * FROM test") print(cursor.fetchall()) cursor.close() conn.close()

Заключение

PyMySQL – драйвер для MySQL предоставляет Python-разработчикам мощный и простой способ взаимодействия с базой данных MySQL. Благодаря чистой реализации, совместимости с Pandas, SQLAlchemy и фреймворками, PyMySQL — надёжный выбор для большинства проектов.