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

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

⚡ Кратко: главные команды

  • pymysql.connect(host=..., user=..., password=...) — подключение без базы.
  • cursor.execute("USE database_name") — выбор базы данных.
  • DictCursor + cursorclass=DictCursor — строки как словари.
  • connection.commit() — сохранить изменения.
  • cursor.executemany(sql, list_of_tuples) — массовое выполнение.
  • connection.rollback() — откатить изменения.
  • CREATE DATABASE, CREATE TABLE — не требуют commit().

🔖 Справочник по транзакциям и курсорам

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

Команда / параметрОписаниеПример
pymysql.connect(...) Создаёт соединение с MySQL. Параметр database необязателен. pymysql.connect(host="ich-db.edu.itcareerhub.de", user="ich1", password="password")
cursor.execute("USE db") Выбирает базу данных для текущего соединения cursor.execute("USE hr")
SHOW DATABASES Возвращает список баз данных на сервере cursor.execute("SHOW DATABASES")
SHOW TABLES Возвращает список таблиц в выбранной базе cursor.execute("SHOW TABLES")

DictCursor

Команда / параметрОписаниеПример
from pymysql.cursors import DictCursor Импорт класса курсора-словаря from pymysql.cursors import DictCursor
cursorclass=DictCursor Передаётся в connect(); строки возвращаются как словари pymysql.connect(..., cursorclass=DictCursor)
row["column_name"] Доступ к значению по имени колонки print(row["first_name"])

Изменение данных

МетодОписаниеПример
connection.commit() Сохраняет изменения INSERT, UPDATE, DELETE в базе connection.commit()
connection.rollback() Отменяет изменения с начала текущей транзакции connection.rollback()
cursor.executemany(sql, params) Выполняет один SQL-запрос с несколькими наборами параметров cursor.executemany("INSERT INTO t (a) VALUES (%s)", [(1,), (2,)])

DDL-команды (создание структуры)

КомандаОписаниеПример
CREATE DATABASE IF NOT EXISTS name Создаёт базу данных, если она ещё не существует cursor.execute("CREATE DATABASE IF NOT EXISTS market")
CREATE TABLE IF NOT EXISTS name (...) Создаёт таблицу, если она ещё не существует cursor.execute("CREATE TABLE IF NOT EXISTS products (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), price DECIMAL(10, 2))")

Команды определения данных (CREATE DATABASE, CREATE TABLE) не требуют вызова commit() — они фиксируются автоматически.

Жизненный цикл транзакции

try:
    # шаги транзакции
    cursor.execute("INSERT INTO ...")
    cursor.execute("UPDATE ...")
    connection.commit()   # успех → сохраняем
except Exception as e:
    connection.rollback() # ошибка → откатываем
    print("Transaction failed:", e)
⚠️ Проверить по документации: в PyMySQL по умолчанию автокоммит отключён. В некоторых других драйверах или при включённом autocommit=True поведение может отличаться — сверяйтесь с документацией.