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

6 СЕМЕСТР / ЛР / ЛР7 / БД ЛР7

.pdf
Скачиваний:
16
Добавлен:
25.06.2023
Размер:
1.18 Mб
Скачать

8)Создали функцию select_data1 в скрипте Python и вызвали в Python

иpgAdmin. Функция select_data1 является копией функции select_data из прошлых пунктов, только созданная из кода Python, поэтому входные,

выходные параметры и принцип действия аналогичны прошлой функции. Код создания и результат вызова функции в СУБД PostgreSQL в соответствии с рисунками 21-22.

Рисунок 21 – Создание, вызов функции select_data1 и ее результат в Python

Рисунок 22 – Вызов функции select_data1 и ее результат в pgAdmin 4

11

9) Создал и вызвал функцию my_func в Python. Функция находит количество сотрудников и их среднии зарплаты, для тех сотрудников у кого они больше переданного min_salaryy. В качестве входного параметра в функцию передается целое число, возвращает функция таблицу значений из трех столбцов: название отдела тип стоковый; количество сотрудников тип целое число; средняя зарплата целое число. Код создания, вызов и результат вызова функции в соответствии с рисунками 23-24.

Рисунок 23 – Код создания, вызов и результат вызова функции my_funс в

Python

12

Рисунок 24 – Вызов и результат вызова функции my_funс в pgAdmin 4 10) Создали функцию my_func1 в среде управления БД DBeaver в

соответствии с рисунком 25.

Рисунок 25 – Код создания функции my_funс1 в DBeaver

11) Вызвали функцию my_func1 из кода Python в соответствии с рисунком 26.

Рисунок 26 – Код создания функции my_funс1 в DBeaver

13

14

Вывод

В ходе данной лабораторной работы приобрели навыки работы с БД на

PostgreSQL с помощью Python.

Научились создавать соединение с БД и выполнять в нее запросы: на выборку данных; на создание и заполнение таблиц; на обновление структуры таблицы. Изучили принципы работы с функциями в БД, научились: вызывать функции с параметрами; писать функции; возвращать результаты функции в виде таблицы.

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

один из самых популярных языков программирования (в рейтинге TIOBE index на Март 2022 он занимает первое место (https://www.tiobe.com/tiobeindex/)) сфера применения полученных знаний огромна.

15

Список использованных источников

1)Лабораторная работа №7 «Связь СУБД Postgresql и Python»

2)Официальный сайт PostgreSQL URL: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

3)Официальный сайт DBeaver URL: https://dbeaver.io/download

16

Приложение А. Код программы.

import pandas as pd import psycopg2

# Подключение к базе данных:

connection = psycopg2.connect(database="students"

,user="postgres"

,password="12345678qwerty"

,host="127.0.0.1"

,port="5432")

#курсор для выполнения операций с БД

cursor = connection.cursor()

# вывод свойства соединения print(connection.get_dsn_parameters(), "\n")

# выполнение запроса к БД cursor.execute("SELECT version();")

# получение результата запроса version_ps = cursor.fetchone()

print("Вы подключены к - ", version_ps, "\n")

df = pd.read_sql_query("SELECT * FROM jobs ", connection) print(df)

# Создание новой таблицы locations в БД sudents cursor.execute('''CREATE TABLE if not exists locations

(location_id int PRIMARY KEY, city varchar(30), postal_code varchar(12)

); ''')

# Заполнение данными тблицы locations cursor.execute(

'''INSERT INTO locations

17

VALUES

(1, 'Roma', '00989'), (2, 'Venice', '10934'), (3, 'Tokyo', '1689'), (4, 'Hiroshima', '6823'),

(5, 'Southlake', '26192'),

(6, 'South San Francisco', '99236'),

(7, 'South Brunswick', '50090'),

(8, 'Seattle', '98199'), (9, 'Toronto', 'M5V 2L7'),

(10, 'Whitehorse', 'YSW 9T2') ON CONFLICT DO NOTHING;'''

)

connection.commit()

# Вывод данных из таблицы locations

table_locations = pd.read_sql_query("SELECT * FROM locations ", connection)

print(table_locations)

cursor.execute(

'''-- Добавление связи теблиц employees и locations по полю location_id

ALTER TABLE IF EXISTS employees ADD COLUMN IF NOT EXISTS location_id INT

constraint empl_loc_fkey references locations(location_id);

--Заполнение поля location_id таблицы employees случайными значениями из поля location_id таблицы locations

UPDATE employees SET location_id = ( SELECT location_id FROM locations where

employees.employee_id = employees.employee_id ORDER BY RANDOM() LIMIT 1

)

WHERE location_id IS NULL;

--Делаем поле внешнего ключа обязательным к заполнению

18

alter table employees alter column location_id set not null;'''

)

connection.commit()

# ЗАПРОС 1

zapros = pd.read_sql_query('''

--ЗАПРОС Найти профессию, диапазон которой между минимальной и

--максимальной зарплатой меньше, чем у остальных

профессий.

--с огригатной функцией в подзапросе

select j.*

, j.max_salary - j.min_salary salary_diff from jobs j

where j.max_salary - j.min_salary = (

select min(jj.max_salary - jj.min_salary) from jobs jj) union all

-- с сортировкой

(select j.*

, j.max_salary - j.min_salary salary_diff from jobs j

order by salary_diff limit 1);

''', connection) print(zapros)

# ЗАПРОС 2

zapros = pd.read_sql_query('''

--ЗАПРОС Вывести названия профессий(job_title) и среднюю зарплату

--(в диапазоне от 2000 до 5000) сотрудников этих

профессий.

select *

19

from

(select j.job_title

, avg(e.salary) avg_salary from jobs j

join employees e using(job_id) group by j.job_title) q

where q.avg_salary between 2000 and 5000;

''', connection) print(zapros)

# ЗАПРОС 3

zapros = pd.read_sql_query('''

select city, EMP, CNT_WORKER, AVG_SALARY from

((select 'Dpt_managers' EMP

,l.city

,count(distinct d.manager_id) CNT_WORKER

,round(avg(e.salary)) AVG_SALARY from departments d

join employees e on d.manager_id = e.employee_id join locations l using(location_id)

group by l.city order by AVG_SALARY) union all

(select 'Managers' EMP

,l.city

,count(distinct e.employee_id) CNT_WORKER

,round(avg(e.salary)) AVG_SALARY

from employees e

join locations l using(location_id)

where e.employee_id not in (select distinct d.manager_id from departments d)

and e.employee_id in (select distinct ee.manager_id from

20

Соседние файлы в папке ЛР7