Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

6сем / lab7_database

.docx
Скачиваний:
3
Добавлен:
27.08.2024
Размер:
427.24 Кб
Скачать

ГУАП

КАФЕДРА № 41

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

доц., канд. техн. наук

Е.Л.Турнецкая

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №7

СВЯЗЬ СУБД POSTGRESQL И PYTHON

по курсу: БАЗЫ ДАННЫХ

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

4016

М.О. Жовтяк

подпись, дата

инициалы, фамилия

Санкт-Петербург 2023

  1. Цель работы

Произвести связь базы данных в PostgreSQL и Python, изучить операции по манипулированию с данными БД, а также созданию простейших пользовательских функций.

  1. Ход работы

В ходе работы будет вестись работа с базой данных администрации некой компании со списком работ, департаментов и работников, созданной в ходе предыдущей лабораторной работы.

Вариант задания для работы с запросами представлен на рисунке 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

  1. Вывод

В ходе лабораторной работы я произвел связь базы данных в 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()

Соседние файлы в папке 6сем