Создание функции 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