
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА 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. Это упростит работу приложения и ускорит его.