Урок 80. MySQL и Python

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

⚡ Кратко: домашнее задание

Работа с базой world:

  1. Выведи названия всех стран из таблицы country с нумерацией.
  2. По введённой стране выведи все города и их население из таблицы city.

Используй параметризованные запросы, with и обработку ошибок.

🏠 Домашнее задание из LMS

1

Список всех стран

Используя базу данных world, выведи названия всех стран из таблицы country. Каждое название должно отображаться с новой строки и иметь номер.

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

1. Aruba
2. Afghanistan
3. Angola
...
239. Zimbabwe
2

Города выбранной страны

Добавьте к предыдущей программе возможность выбора страны. Пользователь должен ввести название страны. Далее выведите все города этой страны и их численность населения.

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

Введите страну: Germany
Berlin — 3386667
Hamburg — 1704735
Munich [München] — 1194560
...

🛠️ Подготовка окружения

  1. Убедитесь, что установлен Python 3.
  2. Установите библиотеку PyMySQL:
    pip install pymysql
  3. Убедитесь, что у вас есть доступ к серверу MySQL с базой данных world. Запишите параметры подключения:
    • host — адрес сервера (например, localhost);
    • user — имя пользователя;
    • password — пароль;
    • database — world.
⚠️ Проверить по документации: структура базы world и точные названия столбцов могут отличаться в зависимости от версии. Обычно таблицы country и city связаны через country.Code = city.CountryCode. Проверьте схему через MySQL Workbench, DBeaver или запрос DESCRIBE city.

📋 Пошаговое решение

Шаг 1. Список всех стран

Файл: homework_task1.py

import pymysql

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

try:
    with pymysql.connect(**config) as connection:
        with connection.cursor() as cursor:
            cursor.execute("SELECT name FROM country ORDER BY name")
            for index, row in enumerate(cursor, start=1):
                print(f"{index}. {row[0]}")
except pymysql.MySQLError as e:
    print("Ошибка базы данных:", e)

Шаг 2. Города выбранной страны

Файл: homework_task2.py

import pymysql

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

country_name = input("Введите страну: ")

try:
    with pymysql.connect(**config) as connection:
        with connection.cursor() as cursor:
            cursor.execute(
                """SELECT city.name, city.population
                   FROM city
                   JOIN country ON city.CountryCode = country.Code
                   WHERE country.name = %s
                   ORDER BY city.population DESC""",
                (country_name,)
            )
            cities = cursor.fetchall()
            if not cities:
                print("Города не найдены. Проверьте название страны.")
            for index, (name, population) in enumerate(cities, start=1):
                print(f"{index}. {name} — {population}")
except pymysql.MySQLError as e:
    print("Ошибка базы данных:", e)

✅ Проверка в VS Code

  1. Откройте папку с проектом в VS Code.
  2. Создайте файл homework_task1.py, скопируйте решение и замените параметры подключения на свои.
  3. Запустите файл через терминал:
    python homework_task1.py
  4. Убедитесь, что в консоли появился нумерованный список стран.
  5. Повторите для homework_task2.py. Введите название страны и проверьте вывод городов.
  6. Если программа падает, проверьте:
    • запущен ли сервер MySQL;
    • правильны ли логин, пароль и имя базы данных;
    • существуют ли таблицы country и city;
    • совпадают ли названия столбцов со схемой базы.
⚠️ Проверить по документации: в учебной базе world связь между городом и страной обычно осуществляется через код страны (CountryCode). Если в вашей версии базы столбцы называются иначе, отредактируйте запрос. Для точной проверки выполните DESCRIBE country и DESCRIBE city.