Добавил:
t.me Инфо для ГУАП студентов от меня: https://kafaka.notion.site/99e6d9b70ca74f7baef3daea17839e5a Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Чурилов / 4 курс / Z9411_Чурилов_БазыДанных_ЛР7

.docx
Скачиваний:
4
Добавлен:
10.11.2024
Размер:
356.94 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ

КАФЕДРА 41

ОЦЕНКА

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

кандидат техн. наук

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

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

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

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

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

Связь СУБД PostgreSQL и Python

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

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

СТУДЕНТ ГР. №

Z9411

А.С.Чурилов

номер группы

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

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

Студенческий билет № 2019/3684

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

Цель работы:

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

Ход работы:

Вариант 20

Диаграмма базы данных (Рисунок 1).

Рисунок 1 – Диаграмма базы данных

Подключился к БД с помощью python (Листинг 1).

Листинг 1 – Подключение к БД

if __name__ == '__main__':

connection = psycopg2.connect(database="students",

user="postgres",

password="admin",

host="127.0.0.1",

port="5432")

Вывожу параметры подключения (Листинг 2, Рисунок 2).

Листинг 2 – Вывод параметров подключения

print(connection.get_dsn_parameters())

Рисунок 2 – Параметры подключения

Создал новую таблицу locations и заполнил ее (Листинг 3, Рисунок 3).

Листинг 3 – Код создания таблицы locations

cursor.execute('''CREATE TABLE if not exists locations(location_id int PRIMARY KEY, city varchar(30), postal_code varchar(12)); ''')

Рисунок 3 – Заполненная таблица locations

Добавил столбец location_id в таблицу employees (Листинг 4).

Листинг 4 – Запрос на добавление столбца

alter table employees add location_id int;

Затем создал запрос на заполнение location_id у работников случайным образом (Листинг 5).

Листинг 5 – Запрос на заполнение столбца

update employees set location_id = (SELECT FLOOR(random()*((select count(*) from locations)))+1)

where employees.employee_id = (SELECT FLOOR(random()*((select count(*) from employees)))+1);

Добавил внешний ключ (Листинг 6).

Листинг 6 – Запрос на добавление внешнего ключа

ALTER TABLE employees

add CONSTRAINT mgr_loc_fkey FOREIGN KEY (location_id) REFERENCES locations(location_id);

Вывел получившуюся таблицу employees (Рисунок 4).

Рисунок 4 – Итоговая таблица employees

Итоговая схема (Рисунок 5).

Рисунок 5 – Итоговая схема

Первый запрос – Найти профессию, диапазон которой между минимальной и максимальной зарплатой меньше, чем у остальных профессий. (Листинг 7, Рисунок 6)

Листинг 7 – Поиск минимальной разницы

select job_title ,(max_salary-min_salary) as raznica

FROM test.jobs

order by raznica asc limit 1;

Рисунок 6 – Результат первого запроса

Второй запрос – Вывести названия профессий(job_title) и среднюю зарплату (в диапазоне от 2000 до 5000) сотрудников этих профессий. (Листинг 8, Рисунок 7).

Листинг 8 – Поиск средней з/п в диапазоне

select job_title, avg(salary)

FROM employees e join jobs j on e.job_id =j.job_id

group by job_title

having avg(salary) between 2000 and 5000;

Рисунок 7 – Результат второго запроса

Третий запрос выводит сотрудников, которые привязаны к городу Roma (Листинг 9, Рисунок 8).

Листинг 9 – Третий запрос

SELECT employees.first_name ||' '||employees.last_name AS employee, locations.city from employees, locations where employees.location_id = locations.location_id and locations.city = 'Roma'

Рисунок 8 – Результат третьего запроса

Функции.

Необходимо создать функцию (Листинг 10, Рисунок 9).

Листинг 10 – Код функции

CREATE FUNCTION select_data(id_dept int) RETURNS SETOF departments AS $$

SELECT * FROM departments WHERE departments.department_id > id_dept;

$$ LANGUAGE SQL;

Рисунок 9 – Результат функции

Результат вызванный с помощью Python (Рисунок 10).

Рисунок 10 – Результат, вызванный с помощью Python

Теперь необходимо в Python создать функцию (Листинг 11).

Листинг 11 – Код создания такой же функции с помощью Python

postgresql_func = """CREATE OR REPLACE FUNCTION select_data1(id_dept int) RETURNS SETOF departments AS $$ SELECT * FROM departments WHERE departments.department_id > id_dept; $$ LANGUAGE SQL;"""

cursor.execute(postgresql_func) # выполнение запроса

Функция вызывается через DBeaver (Рисунок 11).

Рисунок 11 – Результат вызова функции, созданной на Python

Необходимо создать функцию в СУБД PostgreSQL, используя более сложные SQL-запросы.

Была создана функция, которая получает на вход название города и выводит список сотрудников, которые находятся в этом городе (Листинг 12, Рисунок 12).

Листинг 12 – Код создания функции через скрипт в DBeaver

CREATE FUNCTION function1(city1 varchar(30)) RETURNS SETOF text AS $$

SELECT employees.first_name ||' '||employees.last_name AS employee from employees, locations where employees.location_id = locations.location_id and locations.city = city1;

$$ LANGUAGE SQL;

Рисунок 12 – Результат вызова функции

Необходимо создать эту же функцию через скрипт Python (Листинг 13, Рисунок 13).

Листинг 13 – Код Python скрипта

postgresql_func = """CREATE or replace FUNCTION function2(city1 varchar(30)) RETURNS SETOF text AS $$ SELECT employees.first_name ||' '||employees.last_name AS employee from employees, locations where employees.location_id = locations.location_id and locations.city = city1; $$ LANGUAGE SQL;"""

cursor.execute(postgresql_func) # выполнение запроса

Рисунок 13 – Результат вызова функции, созданной с помощью скрипта Python

Вывод:

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

Такой способ гораздо удобнее для многих программистов, что предпочитают работу на Python. Используя Python, можно подключить базу данных к какому-то более серьёзному проекту, где необходима база, а не использовать словари или списки, которые существуют в Python. Это упростит работу приложения и ускорит его.