Урок 80. MySQL и Python

📁 Блок: Базы данных ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя
#close #for #in

⚡ Кратко: примеры кода

  • Создай конфигурацию, подключись через pymysql.connect() и проверь connection.open.
  • Выполняй SELECT через курсор, читай результаты итерацией или fetch*.
  • Для INSERT/UPDATE не забудь connection.commit().
  • Любой пользовательский ввод передавай только через плейсхолдеры %s или %(name)s.
  • Оборачивай код в try ... except pymysql.MySQLError и with.

💻 Рабочие примеры

Все примеры предполагают, что у вас есть доступ к серверу MySQL с базой hr. Замените параметры подключения на свои.

Пример 1. Подключение и проверка

Файл: 01_connect.py

import pymysql

config = {
    "host": "localhost",
    "user": "root",
    "password": "yourpassword",
    "database": "hr",
    "charset": "utf8mb4",
}

connection = pymysql.connect(**config)

if connection.open:
    print("Соединение установлено!")

connection.close()

Пример 2. Выборка всех отделов

Файл: 02_select_all.py

import pymysql

config = {
    "host": "localhost",
    "user": "root",
    "password": "yourpassword",
    "database": "hr",
    "charset": "utf8mb4",
}

connection = pymysql.connect(**config)
try:
    cursor = connection.cursor()
    cursor.execute("SELECT department_id, department_name FROM departments")
    for row in cursor:
        print(row)
finally:
    cursor.close()
    connection.close()

Пример 3. Параметризованный SELECT

Файл: 03_select_param.py

import pymysql

config = {
    "host": "localhost",
    "user": "root",
    "password": "yourpassword",
    "database": "hr",
    "charset": "utf8mb4",
}

department_id = 50  # в реальной программе значение приходит извне

connection = pymysql.connect(**config)
try:
    cursor = connection.cursor()
    cursor.execute(
        "SELECT first_name, last_name FROM employees WHERE department_id = %s",
        (department_id,)  # не забудьте запятую!
    )
    for first_name, last_name in cursor:
        print(f"{first_name} {last_name}")
finally:
    cursor.close()
    connection.close()

Пример 4. Именованные параметры

Файл: 04_named_params.py

import pymysql

config = {
    "host": "localhost",
    "user": "root",
    "password": "yourpassword",
    "database": "hr",
    "charset": "utf8mb4",
}

params = {
    "min_salary": 10000,
    "department_id": 60,
}

connection = pymysql.connect(**config)
try:
    cursor = connection.cursor()
    cursor.execute(
        """SELECT first_name, last_name
           FROM employees
           WHERE department_id = %(department_id)s
              OR salary > %(min_salary)s""",
        params
    )
    for row in cursor:
        print(row)
finally:
    cursor.close()
    connection.close()

Пример 5. INSERT с commit

Файл: 05_insert.py

import pymysql

config = {
    "host": "localhost",
    "user": "root",
    "password": "yourpassword",
    "database": "hr",
    "charset": "utf8mb4",
}

connection = pymysql.connect(**config)
try:
    cursor = connection.cursor()
    cursor.execute(
        "INSERT INTO departments (department_name, location_id) VALUES (%s, %s)",
        ("Data Science", 1700)
    )
    connection.commit()
    print("Добавлено строк:", cursor.rowcount)
finally:
    cursor.close()
    connection.close()

Пример 6. Безопасный запрос с пользовательским вводом

Файл: 06_safe_input.py

import pymysql

config = {
    "host": "localhost",
    "user": "root",
    "password": "yourpassword",
    "database": "hr",
    "charset": "utf8mb4",
}

user_input = input("Введите ID отдела: ")

connection = pymysql.connect(**config)
try:
    cursor = connection.cursor()
    cursor.execute(
        "SELECT first_name, last_name FROM employees WHERE department_id = %s",
        (user_input,)
    )
    for row in cursor:
        print(row)
finally:
    cursor.close()
    connection.close()

Пример 7. Обработка ошибок

Файл: 07_errors.py

import pymysql

config = {
    "host": "localhost",
    "user": "root",
    "password": "wrong_password",
    "database": "hr",
    "charset": "utf8mb4",
}

try:
    connection = pymysql.connect(**config)
    print("Соединение установлено")
except pymysql.OperationalError as e:
    print("Ошибка подключения:", e)
except pymysql.MySQLError as e:
    print("Общая ошибка MySQL:", e)

Пример 8. Полный код с with

Файл: 08_with_statement.py

import pymysql

config = {
    "host": "localhost",
    "user": "root",
    "password": "yourpassword",
    "database": "hr",
    "charset": "utf8mb4",
}

try:
    with pymysql.connect(**config) as connection:
        with connection.cursor() as cursor:
            cursor.execute("SELECT department_id, department_name FROM departments")
            departments = cursor.fetchall()
            for department_id, department_name in departments:
                print(f"{department_id}: {department_name}")
except pymysql.MySQLError as e:
    print("Ошибка работы с базой данных:", e)
⚠️ Проверить по документации: при использовании with pymysql.connect(...) соединение автоматически закрывается при выходе из блока. Если нужно сохранить изменения внутри with, вызовите connection.commit() до завершения блока.