Advertisement
Denjamin

Телефонная книжка

May 5th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.35 KB | None | 0 0
  1. import psycopg2
  2.  
  3.  
  4. # Комплексное решение для создания базы данных эдакой телефонной книги.
  5.  
  6. # Настройки бд чтобы не писать всё одно и тоже в каждой функции.
  7. # DATABASE = "phonebook"
  8. # USER = "postgres"
  9. # PASSWORD = "619620qazwsx"
  10. # HOST = "localhost"  # локалхост пусть будет
  11. # PORT = "5432"  # Порт стандартный
  12. #
  13. #
  14. # def connect_to_db():
  15. #     conn = None
  16. #     try:
  17. #         conn = psycopg2.connect(
  18. #             dbname=DATABASE,
  19. #             user=USER,
  20. #             password=PASSWORD,
  21. #             host=HOST,
  22. #             port=PORT
  23. #         )
  24. #     except (Exception, psycopg2.DatabaseError) as error:
  25. #         print(error)
  26. #     return conn
  27.  
  28.  
  29. # Функция создания табличек
  30.  
  31. def create_db(conn):
  32.     with conn.cursor() as cur:
  33.         cur.execute("""
  34.            CREATE TABLE IF NOT EXISTS clients (
  35.                client_id SERIAL PRIMARY KEY,
  36.                first_name VARCHAR(255) NOT NULL,
  37.                last_name VARCHAR(255) NOT NULL,
  38.                email VARCHAR(255) UNIQUE NOT NULL
  39.            );
  40.        """)
  41.         cur.execute("""
  42.            CREATE TABLE IF NOT EXISTS phone_numbers (
  43.                phone_id SERIAL PRIMARY KEY,
  44.                client_id INTEGER NOT NULL,
  45.                phone_number VARCHAR(20),
  46.                FOREIGN KEY (client_id) REFERENCES clients(client_id) ON DELETE CASCADE
  47.            );
  48.        """)
  49.         conn.commit()
  50.  
  51.  
  52. # Добавим нового клиента
  53. def add_client(conn, first_name, last_name, email, phones=None):
  54.     with conn.cursor() as cur:
  55.         cur.execute("""
  56.            INSERT INTO clients (first_name, last_name, email) VALUES (%s, %s, %s) RETURNING client_id;
  57.            """, (first_name, last_name, email))
  58.         client_id = cur.fetchone()[0]
  59.         if phones:
  60.             for phone in phones:
  61.                 cur.execute("""
  62.                    INSERT INTO phone_numbers (client_id, phone_number) VALUES (%s, %s);
  63.                    """, (client_id, phone))
  64.         conn.commit()
  65.         return client_id
  66.  
  67.  
  68. # Добавим телефон
  69. def add_phone(conn, client_id, phone):
  70.     with conn.cursor() as cur:
  71.         cur.execute("""
  72.            INSERT INTO phone_numbers (client_id, phone_number) VALUES (%s, %s);
  73.            """, (client_id, phone))
  74.         conn.commit()
  75.  
  76.  
  77. # Изменения данных клиента
  78.  
  79. def change_client(conn, client_id, first_name=None, last_name=None, email=None, phones=None):
  80.     items = []
  81.     parameters = []
  82.     if first_name:
  83.         items.append(f"first_name = %s")
  84.         parameters.append(first_name)
  85.     if last_name:
  86.         items.append(f"last_name = %s")
  87.         parameters.append(last_name)
  88.     if email:
  89.         items.append(f"email = %s")
  90.         parameters.append(email)
  91.     with conn.cursor() as cur:
  92.         if items:
  93.             cur.execute(f"""
  94.                UPDATE clients SET {', '.join(items)} WHERE client_id = %s;
  95.                """, parameters + [client_id])
  96.         if phones is not None:
  97.             cur.execute("""
  98.                DELETE FROM phone_numbers WHERE client_id = %s;
  99.                """, (client_id,))
  100.             for phone in phones:
  101.                 cur.execute("""
  102.                INSERT INTO phone_numbers (client_id, phone_number) VALUES (%s, %s);
  103.                """, (client_id, phone))
  104.         conn.commit()
  105.  
  106.  
  107. # Удаление телефона
  108. def delete_phone(conn, client_id, phone):
  109.     with conn.cursor() as cur:
  110.         cur.execute("""
  111.            DELETE FROM phone_numbers WHERE client_id = %s AND phone_number = %s;
  112.            """, (client_id, phone))
  113.         conn.commit()
  114.  
  115.  
  116. # Удаление клиента - вычёркиваем его из нашей жизни.
  117. def delete_client(conn, client_id):
  118.     with conn.cursor() as cur:
  119.         cur.execute("DELETE FROM clients WHERE client_id = %s;", (client_id,))
  120.         conn.commit()
  121.  
  122.  
  123. # Крайне простой поиск клиента по любому из полей, но не вычисление по IP
  124. def find_client(conn, first_name=None, last_name=None, email=None, phone=None):
  125.     with conn.cursor() as cur:
  126.         query = """
  127.            SELECT c.* FROM clients c
  128.            LEFT JOIN phone_numbers p ON c.client_id = p.client_id
  129.            WHERE
  130.        """
  131.         params = []
  132.  
  133.         conditions = []
  134.         if first_name:
  135.             conditions.append(f"c.first_name = %s")
  136.             params.append(first_name)
  137.         if last_name:
  138.             conditions.append(f"c.last_name = %s")
  139.             params.append(last_name)
  140.         if email:
  141.             conditions.append(f"c.email = %s")
  142.             params.append(email)
  143.         if phone:
  144.             conditions.append(f"p.phone_number = %s")
  145.             params.append(phone)
  146.  
  147.         query += " OR ".join(conditions) + ";"
  148.  
  149.         cur.execute(query, tuple(params))
  150.         return cur.fetchall()
  151.  
  152.  
  153. # А вот тут самое веселье, здесь инициируем подключение к базе данных.
  154. with psycopg2.connect(database="phonebook", user="postgres", password="619620qazwsx",
  155.                       host="localhost, port=5432") as conn:
  156.     # Создадим базу данных
  157.     create_db(conn)
  158.  
  159.     # Добавляем данные клиента
  160.     client_id1 = add_client(conn, "Иван", "Иванов", "[email protected]", ["+7-900-123-45-67"])
  161.     client_id2 = add_client(conn, "Петр", "Петров", "[email protected]")
  162.  
  163.     # Добавим телефоны
  164.     add_phone(conn, client_id1, "+7-920-123-45-89")
  165.     add_phone(conn, client_id2, "+7-930-123-45-99")
  166.  
  167.     # редактируем данные
  168.     change_client(conn, client_id1, email="[email protected]", phones=["+7-950-123-45-77"])
  169.  
  170.     # Поищем клиента и напечатаем на экране.
  171.     print(find_client(conn, first_name="Иван"))
  172.     print(find_client(conn, phone="+7-950-123-45-77"))
  173.  
  174.     # Удалим телефон
  175.     delete_phone(conn, client_id1, "+7-950-123-45-77")
  176.  
  177.     # Удалим клиента из базы данных
  178.     delete_client(conn, 1)  # Удаляем по ID клиента
  179.  
  180. '''
  181. THE END - Всех с праздниками!
  182. '''
  183.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement