
6сем / lab7_database
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., канд. техн. наук |
|
|
|
Е.Л.Турнецкая |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №7 |
СВЯЗЬ СУБД POSTGRESQL И PYTHON |
по курсу: БАЗЫ ДАННЫХ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4016 |
|
|
|
М.О. Жовтяк |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы
Произвести связь базы данных в PostgreSQL и Python, изучить операции по манипулированию с данными БД, а также созданию простейших пользовательских функций.
Ход работы
В ходе работы будет вестись работа с базой данных администрации некой компании со списком работ, департаментов и работников, созданной в ходе предыдущей лабораторной работы.
Вариант задания для работы с запросами представлен на рисунке 1, схема данных БД на рисунке 2
Рисунок 1 – Запросы, выданные по варианту
Рисунок 2 – Схема данных БД
Производится подключение Python к СУБД PostgreSQL. Это представлено на рисунке 3.
Рисунок 3 – Подключение python к СУБД PostgreSQL
Создаётся новая таблица locations, она заполняется данными. Новая таблица представлена на рисунке 4.
Рисунок 4 – Создание таблицы locations
Вручную в DBeaver создаётся колонка location_id в таблице employees, создаётся связь с таблицей locations. Новая схема данных БД представлена на рисунке 5.
Рисунок 5 – Новая схема данных БД
Вручную с помощью функции UPDATE в случайных местах заполняются данные locations_id в таблице employees. Результат на рисунке 6.
Рисунок 6 – Обновление данных location_id
Создаётся SQL-запрос на вывод средней зарплаты по каждому из отделов. Результат представлен на рисунке 7, листинг в Приложении.
Рисунок 7 – Вывод средней зарплаты по каждому из отделов
В результате выведены номер отдела, и округленное значение каждой позиции средней зарплаты.
Создаётся SQL-запрос на вывод количества сотрудников с определенной должностью. Результат представлен на рисунке 8, листинг в Приложении.
Рисунок 8 – Вывод количества сотрудников с определенной должностью
В результате выведены столбцы с id работы, количеством сотрудников, закрепленных за этим id.
Создаётся SQL-запрос на вывод количества сотрудников из разных городов. Результат представлен на рисунке 9, листинг в Приложении.
Рисунок 9 - Вывод количества сотрудников из разных городов
В результате выведены города и количество сотрудников, которые живут там.
Создаётся функция select_data в PostgreSQL, которая на вход получает код отдела и выводит информацию из таблицы departments, фильтруя данные по коду отдела. Результат этой процедуры представлен на рисунке 10.
Рисунок 10 – Результат создания функции
Данная функция вызывается в Python. Результат представлен на рисунке 11.
Рисунок 11 – Вызов select_data в Python
Теперь создаётся аналогичная функция уже в Python с названием select_data1. Её листинг представлен в Приложении. Результат её вывода в СУБД на рисунке 12.
Рисунок 12 – Вызов select_data1 в СУБД
Создаётся функция locations_spend в СУБД, которая выводит количество денег, выделяемое на каждый город компанией. Результат на рисунке 13.
Рисунок 13 – Создание и вызов locations_spend в СУБД
Теперь создаётся аналогичная функция уже в Python с названием locations_spend1. Её листинг представлен в Приложении. Результат её вывода в СУБД на рисунке 14.
Рисунок 13 – Создание и вызов locations_spend 1 в Python
Вывод
В ходе лабораторной работы я произвел связь базы данных в PostgreSQL и Python, углубил знания работы с SQL, добавив новую таблицу в БД, выполнив простейшие запросы, а также созданием пользовательских функций.
В ходе работы проблем не возникло.
ПРИЛОЖЕНИЕ
import pandas as pd
import psycopg2
connection = psycopg2.connect(database="students",
user="postgres",
password="admin",
host="127.0.0.1",
port="5432")
cursor = connection.cursor() # курсор для выполнения операций с БД
# Запрос 1
connection.commit()
task1 = pd.read_sql_query('''select department_id, round(AVG(salary))
as average_salary from public.employees group by department_id''', connection)
print('\n', task1)
# Запрос 2
connection.commit()
task2 = pd.read_sql_query('''select job_id, count(job_id)
from public.employees group by job_id''', connection)
print('\n', task2)
# Запрос 3
connection.commit()
task3 = pd.read_sql_query('''select locations.city ,
count(employees.location_id)
from public.employees, public.locations
where locations.location_id = employees.location_id
group by locations.location_id''', connection)
print('\n', task3)
# Вызов select_data
cursor.callproc('public.select_data', [20, ])
result = cursor.fetchall()
result_proc = pd.DataFrame(result)
print('\n', result_proc)
# Создание select_data1
postgresql_func = """
CREATE OR REPLACE FUNCTION public.select_data1(id_dept int) RETURNS
SETOF public.departments AS $$
SELECT * FROM public.departments WHERE departments.department_id >
id_dept;
$$ LANGUAGE SQL;
"""
cursor.execute(postgresql_func)
connection.commit()
# Создание и вызов locations_spend1
postgresql_func = """
CREATE OR REPLACE FUNCTION public.locations_spend1()
RETURNS table(place varchar, summa int) as $$
select locations.city, sum(salary)
from public.employees, public.locations
where employees.location_id = locations.location_id
group by locations.city;
$$ LANGUAGE SQL;
"""
cursor.execute(postgresql_func)
cursor.callproc('public.locations_spend1')
result = cursor.fetchall()
result_proc = pd.DataFrame(result)
print('\n', result_proc)
connection.commit()
connection.close()
cursor.close()