
- •Цель работы
- •Вариант задания
- •Ход работы
- •Подключение к субд PostgreSql
- •Создание новой таблицы с помощью Python и заполнение её данными
- •Запросы в Python
- •Создание функции select_data
- •Создание собственной пользовательской функции
- •Заключение
- •Список использованных источников
- •Приложение а Полный листинг кодов
Создание функции select_data
Создал функцию select_data в PostgreSQL, которая на вход получает код отдела и выводит информацию из таблицы departments, фильтруя данные по коду отдела.
Листинг 9 – Создание функции select_data
-
CREATE FUNCTION select_data(id_dept int) RETURNS SETOF departments AS $$
SELECT * FROM departments WHERE departments.department_id > id_dept;
$$ LANGUAGE SQL;
SELECT * FROM select_data(30);
Результат вызова на рисунке 12 (выведены только отделы с id>30).
Рисунок
12 – Создание функции
Теперь вернемся в Python и попробуем вызвать созданную функцию из скрипта в Python. Результат представлен на рисунке 13.
Листинг 10 – Вызов созданной функции из скрипта в Python
-
cursor.callproc('select_data',[20,])# вызов функции (название
из PostgreSQL)
result = cursor.fetchall() # получение результатов
result_proc = pd.DataFrame(result)# создание датафрейма с
результатом
print(result_proc)
Рисунок
13 – Вызов созданной функции из скрипта
в Python
Попробуем выполнить обратное действие, создадим функцию select_data1, аналогичную функции выше в скрипте Python и внесем изменения в БД в PostgreSQL
Листинг 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) # выполнение запроса
connection.commit() #внесение изменений в БД
connection.close() # закрытие соединения
cursor.close() # закрытие cursor
Проверим, как это выглядит в нашей СУБД (рис.13).
Рисунок
13 – Результат выполнения функции
select_data1
Создание собственной пользовательской функции
Создал функцию, которая вычисляет среднюю зарплату сотрудников по заданному местоположению. Функция принимает в качестве аргумента название местоположения и возвращает среднюю зарплату сотрудников в этом месте. Функция объединяет таблицы "сотрудники" и "местоположения" на основе столбца location_id и фильтрует сотрудников на основе входного аргумента местоположения. Затем функция вычисляет среднюю зарплату с помощью агрегатной функции AVG. Результат работы кода представлен на рисунке 14.
Листинг 12 – Средняя зарплата сотрудников по заданному местоположению
CREATE OR REPLACE FUNCTION average_salary_by_location(location varchar) RETURNS float AS $$ BEGIN RETURN ( SELECT AVG(salary) FROM employees e JOIN locations l ON e.location_id = l.location_id WHERE l.city = location ); END; $$ LANGUAGE plpgsql; |
Рисунок
14 – Средняя зарплата сотрудников по
заданному местоположению
Создал эту же функцию через скрипт Python.
Листинг 13 – Средняя зарплата сотрудников по заданному местоположению в Python
#код функции postgresql_func = """ CREATE OR REPLACE FUNCTION average_salary_by_location1(location varchar) RETURNS float AS $$ BEGIN RETURN ( SELECT AVG(salary) FROM employees e JOIN locations l ON e.location_id = l.location_id WHERE l.city = location ); END; $$ LANGUAGE plpgsql; """ cursor.execute(postgresql_func) # выполнение запроса
connection.commit() #внесение изменений в БД connection.close() # закрытие соединения cursor.close() # закрытие cursor |
Результат проверки продемонстрирован на рисунке 15.
Рисунок
15 – Средняя зарплата сотрудников по
заданному местоположению Python