DummyJSON
DummyJSON – это бесплатный фейковый REST API, предоставляющий готовые данные в формате JSON для разработки и тестирования
Начало работы и примеры запросов¶
Сервис позволяет обращаться и получать данные без дополнительных авторизаций и регистраций .
DummyJSON включает несколько основных ресурсов (эндпоинтов) с фиктивными данными:
-
Products – список товаров (примерные данные для интернет-магазина)
-
Users – перечень пользователей с профилями
-
Carts – данные о корзинах покупок
-
Posts – коллекция постов/статей (например, для блога)
-
Comments – комментарии к постам
-
Todos – список задач (to-do items)
Что понадобится: для выполнения шагов необходимо иметь установленные библиотеки requests (для HTTP-запросов) и psycopg2 (для подключения к PostgreSQL). Также должен быть развернут локальный сервер PostgreSQL и для удобства используем развернутый Jupyter.
🟢requests
🟢psycopg2
🟢Поднят контейнеры с PostgreSQL (смотри здесь) и Jupyter(смотри здесь)
Получение списка товаров (Products)¶
Проверим, что код работает
import requests
import psycopg2
#Отправляем GET-запрос к API DummyJSON для продуктов
response = requests.get("https://dummyjson.com/products?limit=0")
# ?limit=0 снимет ограничение на количество
print("Status code:", response.status_code)
# Преобразуем ответ в Python-словарь (JSON)
data = response.json()
print("Ключи в ответе:", data.keys())
print("Количество полученных товаров:", len(data["products"]))
Должны получить следующей результат:
Status code: 200
Ключи в ответе: dict_keys(['products', 'total', 'skip', 'limit'])
Количество полученных товаров: 194
Пояснение к коду
Мы добавили параметр ?limit=0 к URL. По умолчанию DummyJSON возвращает первые 30 элементов ресурса , но с помощью параметра limit=0 можно снять ограничение.
Посмотрим пример товара
first_product = data["products"][0]
print("Пример товара:")
print("ID:", first_product["id"])
print("Title:", first_product["title"])
print("Price:", first_product["price"])
print("Category:", first_product["category"])
Пример товара
Пример товара: ID: 1 Title: Essence Mascara Lash Princess Price: 9.99 Category: beauty
Получение списка пользователей (Users)¶
API DummyJSON для пользователей возвращает список объектов с подробной информацией о каждом пользователе – имя, фамилия, возраст, email, а также множество дополнительных данных: адрес, компания, банковская информация, и т.п.
# не забудь импортировать библиотеки
response = requests.get("https://dummyjson.com/users?limit=0")
data_users = response.json()
print("Количество полученных пользователей:", len(data_users["users"]))
# Выведем пример первой записи пользователя
first_user = data_users["users"][0]
print("Пример пользователя:")
print("ID:", first_user["id"])
print("First name:", first_user["firstName"])
print("Last name:", first_user["lastName"])
print("Age:", first_user["age"])
print("Email:", first_user["email"])
Получение других ресурсов (Posts, Comments, Carts, Todos)¶
response = requests.get("https://dummyjson.com/todos")
todos_data = response.json()
print("Пример задачи:", todos_data["todos"][0])
Сохранение данных в базу данных PostgreSQL¶
Теперь перейдем к задаче сохранения полученных данных в локальную базу данных PostgreSQL. Для взаимодействия с БД используем библиотеку psycopg2 . План действий следующий: 1. Установить соединение с базой данных. 2. Создать таблицы для хранения нужных данных (например, таблицу products и таблицу users ). 3. Вставить данные, полученные от API, в соответствующие таблицы. 4. Закрыть соединение с базой.
Подключение к базе данных¶
Наш PostgreSQL и Jupyter были созданы с доступом в одной сети и контейнеры должны видеть друг друга, поэтому для подключения мы используем сохраненные environment
import os
db_url = os.environ["DATABASE_URL"]
try:
conn = psycopg2.connect(db_url)
print("Соединение с базой установлено")
except Exception as e:
print("Ошибка подключения к базе данных:", e)
Что за DATABASE_URL?
Это переменная, которую мы задаем при поднятие Jupyter контейнера:
смотри здесьАльтернативный способ подключения к БД
# Альтернативный способ подключения
DB_NAME = "app_db"
DB_USER = "postgres"
DB_PASS = "postgres_password_here"
DB_HOST = "postgres"
DB_PORT = "5432"
try:
conn = psycopg2.connect(dbname=DB_NAME, user=DB_USER, password=DB_PASS, host=DB_HOST, port=DB_PORT)
print("Соединение с базой установлено")
except Exception as e:
print("Ошибка подключения к базе данных:", e)
Нюансы про подключения к БД
Обрати внимание на DB_HOST, у меня Jupyter и PostgreSQL подняты в одной сети на разных контейнерах. Jupyter будет видеть хост PostgreSQL по имени контейнера, поэтому указывается "postgres".
Если ты запускаешь код локально в VSCode и у тебя поднят только контейнер PostgreSQL, то БД будет доступа по адресу DB_HOST = "localhost"
Должны получить: Соединение с базой установлено
Создание таблицы для товаров и сохранение данных Products¶
- Создадим таблицу products в базе, которая будет хранить данные товаров.
- Запрос создания таблицы выполним через cur.execute()
- Зафиксируем изменение транзакции вызовом conn.commit()
create_products_table = """
CREATE TABLE IF NOT EXISTS products (
id INT PRIMARY KEY,
title TEXT,
price NUMERIC,
category TEXT
);
"""
cur.execute(create_products_table)
conn.commit()
print("Таблица products создана (если ее не было).")
Чтобы вставлять данные безопасно и эффективно, будем использовать параметризованные запросы с плейсхолдерами %s для значений – это позволяет psycopg2 самому подставлять данные и предотвращает SQL-инъекции.
# Подготовим шаблон INSERT-запроса для товаров
insert_product_query = "INSERT INTO products (id, title, price, category) VALUES (%s, %s, %s, %s);"
# Вставляем записи товаров в таблицу
for prod in data["products"]:
cur.execute(insert_product_query, (prod["id"], prod["title"],
prod["price"], prod["category"]))
# Фиксируем транзакцию после вставки всех записей
conn.commit()
print(f"Вставлено товаров: {len(data['products'])}")
Мы перебираем каждый товар prod из списка data["products"] и выполняем cur.execute с нашим шаблонным запросом, передавая значения полей в виде кортежа. Благодаря использованию %s в запросе и передачи параметров вторым аргументом, библиотека сама подставит каждый элемент кортежа на место записей вызываем conn.commit() для сохранения изменений в базе.
Проверим, что данные вставились в таблицу
cur.execute("SELECT COUNT(*) FROM products;")
count_products = cur.fetchone()[0]
print("Число записей в таблице products:", count_products)
Ожидаемый результат: Число записей в таблице products: 194
Создание таблицы для пользователей и сохранение данных Users¶
Аналогично создадим таблицу users для хранения информации о пользователях.
create_users_table = """
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY,
firstName TEXT,
lastName TEXT,
age INT,
email TEXT
);
"""
cur.execute(create_users_table)
conn.commit()
print("Таблица users создана (если ее не было).")
insert_user_query = "INSERT INTO users (id, firstName, lastName, age, email) VALUES (%s, %s, %s, %s, %s);"
for user in data_users["users"]:
cur.execute(insert_user_query, (user["id"], user["firstName"],
user["lastName"], user["age"], user["email"]))
conn.commit()
print(f"Вставлено пользователей: {len(data_users['users'])}")
Закрытие соединения¶
После того, как все операции завершены, закроем курсор и соединение с базой данных, чтобы освободить ресурсы:
Заключение¶
Мы пошагово рассмотрели, как с помощью Python в Jupyter Notebook работать с открытым API DummyJSON и базой PostgreSQL.