/
fess
/
BaseDate
Обзор
Документация
Войти
/
fess
/
BaseDate
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Homework.py
217 строк
8 KB
Станислав Константинов
upload Homework.py
02 фев 2026, 17:30
Верифицирован
02 фев 2026, 17:30
db161c6
Код
Авторство
О чём код?
import psycopg2 # 1.Функция, создающая структуру БД (таблицы). def creat_db(conn): cur = conn.cursor() # Удаляем таблицы если существуют (в обратном порядке из-за внешних ключей) cur.execute("DROP TABLE IF EXISTS mobile;") cur.execute("DROP TABLE IF EXISTS clients;") cur.execute(""" CREATE TABLE IF NOT EXISTS clients( email VARCHAR(40) PRIMARY KEY UNIQUE, first_name VARCHAR(40) NOT NULL, last_name VARCHAR(40) NOT NULL ); """) cur.execute(""" CREATE TABLE IF NOT EXISTS mobile( email VARCHAR(40) REFERENCES clients(email), mobile_numbers VARCHAR(40) ); """) conn.commit() # фиксируем в БД print("Таблицы созданы") cur.close() # 2.Функция, позволяющая добавить нового клиента. def add_client(conn, first_name, last_name, email, mobile= None): cur = conn.cursor() cur.execute(""" INSERT INTO clients(email,first_name, last_name) VALUES(%s, %s, %s); """, (email, first_name, last_name,)) conn.commit() cur.execute(""" INSERT INTO mobile(email,mobile_numbers) VALUES(%s, %s); """, (email, mobile,)) conn.commit() # фиксируем в БД print(f'Клиент добален {first_name} {last_name}') cur.close() # 3.Функция, позволяющая добавить телефон для существующего клиента. def add_mobile(conn, email, mobile): cur = conn.cursor() cur.execute(""" INSERT INTO mobile(email,mobile_numbers) VALUES(%s, %s); """, (email, mobile,)) conn.commit() # фиксируем в БД print(f'Телефон {mobile} для {email} добавлен.') cur.close() # 4. Функция, позволяющая изменить данные о клиенте. def update_client_info(conn: object, email: object, first_name: object, last_name: object) -> None: cur = conn.cursor() cur.execute(""" UPDATE clients SET first_name = %s, last_name = %s WHERE email = %s; """, (first_name, last_name, email,)) conn.commit() # фиксируем в БД print(f'Для {email} данные изменены на {first_name} {last_name}') cur.close() # 5. Функция, позволяющая удалить телефон для существующего клиента. def del_mobile (conn, email, mobile): cur = conn.cursor() cur.execute(""" DELETE FROM mobile WHERE email = %s AND mobile_numbers = %s; """, (email,mobile,)) conn.commit() # фиксируем в БД print(f'Телефон {mobile} клиент с email {email} удален') cur.close() # 6. Функция, позволяющая удалить существующего клиента. def del_client (conn, email): cur = conn.cursor() cur.execute(""" DELETE FROM mobile WHERE email = %s; """, (email,)) cur.execute(""" DELETE FROM clients WHERE email = %s; """, (email,)) conn.commit() # фиксируем в БД cur.close() # 7. Функция, позволяющая найти клиента по его данным. def find_client(conn, search_term): cur = conn.cursor() try: search_pattern = f"%{search_term}%" # Улучшенный запрос для поиска query = """ SELECT DISTINCT c.first_name, c.last_name, c.email, COALESCE( ARRAY_AGG(m.mobile_numbers) FILTER (WHERE m.mobile_numbers IS NOT NULL), ARRAY[]::VARCHAR[] ) as phones FROM clients c LEFT JOIN mobile m ON c.email = m.email WHERE c.first_name ILIKE %s OR c.last_name ILIKE %s OR c.email ILIKE %s OR m.mobile_numbers ILIKE %s GROUP BY c.email, c.first_name, c.last_name ORDER BY c.last_name, c.first_name """ cur.execute(query, (search_pattern, search_pattern, search_pattern, search_pattern)) results = cur.fetchall() # Выводим результаты if results: print(f"\nНайдено клиентов: {len(results)}") print("=" * 60) for row in results: first_name, last_name, email, phones = row phones_str = ", ".join(phones) if phones else "нет телефона" print(f"{first_name} {last_name}") print(f"Email: {email}") print(f"Телефоны: {phones_str}") print("-" * 40) print("=" * 60) else: print(f"Клиенты по запросу '{search_term}' не найдены") return results except Exception as e: print(f"Ошибка при поиске клиента: {e}") return [] finally: cur.close() # Функция для вывода всех клиентов (для тестирования) def show_all_clients(conn): """Показать всех клиентов""" cur = conn.cursor() try: cur.execute(""" SELECT c.first_name, c.last_name, c.email, m.mobile_numbers FROM clients c LEFT JOIN mobile m ON c.email = m.email GROUP BY c.first_name, c.last_name, c.email, m.mobile_numbers ORDER BY c.email """) results = cur.fetchall() if results: print("\n" + "=" * 80) print("СПИСОК ВСЕХ КЛИЕНТОВ:") print("=" * 80) for row in results: first_name, last_name, email, phones = row phones_str = ", ".join(phones) if phones else "нет телефона" print( f"{first_name:10} {last_name:15} | Email: {email:20} | Телефоны: {phones_str}") print("=" * 80) else: print("В базе данных нет клиентов") except Exception as e: print(f"Ошибка: {e}") finally: cur.close() with psycopg2.connect(database="netology_db", user="postgres", password=" ") as conn: with conn.cursor() as cur: print("\n1. Создание структуры БД:") creat_db(conn) # 2. Добавляем клиентов print("\n2. Добавление клиентов:") client1_id = add_client(conn, "Иван", "Иванов", "ivan@example.com","+79161234567") client2_id = add_client(conn, "Петр", "Петров", "petr@example.com", "+79169876543") add_client(conn, "Мария", "Сидорова", "maria@example.com") # 3. Добавляем дополнительный телефон print("\n3. Добавление телефона:") add_mobile(conn, "maria@example.com", "+79031112233") # 4. Обновляем данные клиента print("\n4. Обновление данных:") update_client_info (conn, "petr@example.com", "Пётро", "Петрович") # Показываем всех клиентов print("\n5. Все клиенты в базе:") show_all_clients(conn) # 5. Удаление телефона del_mobile(conn, "ivan@example.com", "+79161234567") show_all_clients(conn) # 6. Функция, позволяющая удалить существующего клиента. del_client(conn,"maria@example.com") show_all_clients(conn) # 7. Поиск клиентов print("\n6. Поиск клиентов:") print("\n Поиск по имени 'Иван':") find_client(conn, "Иван")