Урок 82. MySQL. Транзакции

📁 Блок: Базы данных ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя
#from #import #if #not #print #try #except #as

⚡ Кратко: ответы

  • 1 — b, d
  • 2 — c
  • 3 — b, c, d
  • 4 — c
  • 5 — c
  • Практика: создать таблицу, вставить через executemany(), обновить цены через UPDATE.

✅ Ответы на задания для закрепления

1

Почему может быть полезно не указывать базу данных при подключении?

Ответ: b, d

Неуказание базы позволяет создавать или удалять базы данных, а также выбирать нужную базу позже вручную через USE. Время соединения и скорость выборки от этого не зависят.

2

Что произойдёт, если выполнить запрос к таблице без выбора базы данных?

Ответ: c

Если база не выбрана, MySQL вернёт ошибку No database selected.

3

После какого действия нужно вызывать commit()?

Ответ: b, c, d

commit() нужен после изменяющих запросов: INSERT, UPDATE, DELETE. После SELECT коммит не требуется, потому что данные не изменяются.

4

Что делает метод executemany()?

Ответ: c

executemany() позволяет выполнять один SQL-запрос с разными данными. Вторым аргументом передаётся список кортежей.

5

Что произойдёт, если после INSERT не вызвать commit()?

Ответ: c

Изменения останутся во временном хранилище транзакции и будут потеряны после закрытия соединения.

🛠️ Решения практических задач

6

Добавление товаров в таблицу

Файл: practice_task1.py

from pymysql.cursors import DictCursor
import pymysql

config = {
    "host": "ich-edit.edu.itcareerhub.de",
    "user": "ich1",
    "password": "ich1_password_ilovedbs",
}

with pymysql.connect(**config, cursorclass=DictCursor) as connection:
    with connection.cursor() as cursor:
        cursor.execute("CREATE DATABASE IF NOT EXISTS market")
        cursor.execute("USE market")

        cursor.execute("""
            CREATE TABLE IF NOT EXISTS products (
                id INT AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(100),
                price DECIMAL(10, 2)
            )
        """)

        products = [
            ("Notebook", 10.00),
            ("Pencil", 1.00),
            ("Bag", 25.00)
        ]
        cursor.executemany(
            "INSERT INTO products (name, price) VALUES (%s, %s)",
            products
        )
        connection.commit()

        print("Products added:")
        cursor.execute("SELECT id, name, price FROM products")
        for row in cursor.fetchall():
            print(f"{row['id']}. {row['name']} — ${row['price']:.2f}")

Разбор:

  • Подключаемся без указания базы, потому что сначала создаём её.
  • Используем DictCursor, чтобы удобно обращаться к row["id"], row["name"], row["price"].
  • executemany() вставляет все товары одним вызовом.
  • commit() сохраняет изменения в базе.
7

Массовое повышение цен

Файл: practice_task2.py

from pymysql.cursors import DictCursor
import pymysql

config = {
    "host": "ich-edit.edu.itcareerhub.de",
    "user": "ich1",
    "password": "ich1_password_ilovedbs",
}

with pymysql.connect(**config, cursorclass=DictCursor) as connection:
    with connection.cursor() as cursor:
        cursor.execute("USE market")
        cursor.execute("UPDATE products SET price = price * 1.2")
        connection.commit()

        print("Prices updated.\n\nProducts after update:")
        cursor.execute("SELECT id, name, price FROM products")
        for row in cursor.fetchall():
            print(f"{row['id']}. {row['name']} — ${row['price']:.2f}")

Разбор:

  • Один запрос UPDATE products SET price = price * 1.2 увеличивает все цены на 20%.
  • После изменения вызываем commit().
  • Выводим обновлённые данные через DictCursor.