🏠 Обзорный мини-проект

Summary session не содержит отдельного задания в LMS. Выполните обзорный мини-проект, чтобы закрепить подключение к MySQL, выполнение запросов, работу с DictCursor и транзакции.

Задание 1. Создание базы данных

Напишите программу, которая:

  • подключается к серверу MySQL без указания базы данных;
  • создаёт базу данных notes_app_<your_group>_<your_full_name>;
  • выбирает созданную базу через USE;
  • выводит сообщение о результате.

Пример вывода:

Database 'notes_app' created or already exists.

Задание 2. Создание таблицы и добавление заметки

Продолжите предыдущую программу:

  • создайте таблицу notes с полями: id, title, content;
  • вставьте одну заметку в таблицу;
  • выполните commit() после вставки;
  • выведите сообщение Note added: <title>.

Пример вывода:

Note added: Shopping list

Задание 3. Вывод заметок через DictCursor

Модифицируйте программу так, чтобы:

  • подключение использовало DictCursor;
  • после добавления заметки выводились все заметки из таблицы;
  • для каждой заметки печатались id, title и content в читаемом виде.

Пример вывода:

Note added: Shopping list

All notes:
1. Shopping list — Buy milk, bread and eggs

Задание 4. Обновление и удаление в транзакции

Добавьте в программу возможность обновлять и удалять заметки в рамках транзакции:

  • попросите пользователя выбрать действие: update или delete;
  • для обновления измените content заметки по её id;
  • для удаления удалите заметку по её id;
  • оберните операцию в try/except и используйте commit() при успехе или rollback() при ошибке.

Пример вывода:

Choose action (update/delete): update
Enter note id: 1
Enter new content: Buy milk, bread, eggs and cheese
Note updated.

All notes:
1. Shopping list — Buy milk, bread, eggs and cheese

Задание 5. Массовое добавление заметок

Добавьте в программу возможность массово вставлять заметки через executemany(). Подготовьте список из трёх заметок и добавьте их одним вызовом.

Пример итоговой программы

import pymysql
from pymysql.cursors import DictCursor

# Замените на свои реальные данные подключения
admin_config = {
    "host": "ich-edit.edu.itcareerhub.de",
    "user": "ich1",
    "password": "ich1_password_ilovedbs",
}

group = "pyfund"
full_name = "ivan_ivanov"
database_name = f"notes_app_{group}_{full_name}"


def create_database():
    with pymysql.connect(**admin_config) as connection:
        with connection.cursor() as cursor:
            cursor.execute(f"CREATE DATABASE IF NOT EXISTS {database_name}")
            cursor.execute(f"USE {database_name}")
            cursor.execute("""
                CREATE TABLE IF NOT EXISTS notes (
                    id INT AUTO_INCREMENT PRIMARY KEY,
                    title VARCHAR(200),
                    content TEXT
                )
            """)
        print(f"Database '{database_name}' created or already exists.")


def add_note(title, content):
    db_config = {**admin_config, "database": database_name, "cursorclass": DictCursor}
    with pymysql.connect(**db_config) as connection:
        with connection.cursor() as cursor:
            cursor.execute(
                "INSERT INTO notes (title, content) VALUES (%s, %s)",
                (title, content)
            )
        connection.commit()
    print(f"Note added: {title}")


def list_notes():
    db_config = {**admin_config, "database": database_name, "cursorclass": DictCursor}
    with pymysql.connect(**db_config) as connection:
        with connection.cursor() as cursor:
            cursor.execute("SELECT * FROM notes ORDER BY id")
            notes = cursor.fetchall()

    print("\nAll notes:")
    if not notes:
        print("No notes found.")
    for note in notes:
        print(f"{note['id']}. {note['title']} — {note['content']}")


def update_or_delete():
    db_config = {**admin_config, "database": database_name, "cursorclass": DictCursor}
    action = input("Choose action (update/delete): ").strip().lower()
    note_id = int(input("Enter note id: "))

    with pymysql.connect(**db_config) as connection:
        try:
            with connection.cursor() as cursor:
                if action == "update":
                    new_content = input("Enter new content: ")
                    cursor.execute(
                        "UPDATE notes SET content = %s WHERE id = %s",
                        (new_content, note_id)
                    )
                    print("Note updated.")
                elif action == "delete":
                    cursor.execute("DELETE FROM notes WHERE id = %s", (note_id,))
                    print("Note deleted.")
                else:
                    print("Unknown action.")
                    return
            connection.commit()
        except Exception as e:
            connection.rollback()
            print("Operation failed:", e)


def add_many_notes(notes):
    db_config = {**admin_config, "database": database_name}
    with pymysql.connect(**db_config) as connection:
        with connection.cursor() as cursor:
            cursor.executemany(
                "INSERT INTO notes (title, content) VALUES (%s, %s)",
                notes
            )
        connection.commit()
    print(f"Added {len(notes)} notes.")


if __name__ == "__main__":
    create_database()
    add_note("Shopping list", "Buy milk, bread and eggs")
    list_notes()
    update_or_delete()
    list_notes()
    add_many_notes([
        ("Work", "Finish the report"),
        ("Study", "Review MySQL transactions"),
        ("Travel", "Book train tickets"),
    ])
    list_notes()
Проверить по документации: в реальных проектах пароли и учётные данные не хранятся прямо в коде. Используйте переменные окружения или файлы конфигурации.

Что проверить

  • Программа создаёт базу данных и таблицу без ошибок.
  • Заметки добавляются, выводятся через DictCursor.
  • Обновление и удаление работают в транзакции с commit() и rollback().
  • Массовое добавление выполняется через executemany().
  • Все соединения и курсоры закрываются через with.