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

6 семестр / БД6

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

ГУАП

КАФЕДРА № 41

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

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

старший преподаватель

Б.К. Акопян

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

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

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

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

СВЯЗЬ СУБД POSTGRESQL И PYTHON

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

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

СТУДЕНТ ГР. №

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

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

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

Цель работы:

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

Ход работы:

Вариант задания представлен на рисунке 1.

Рисунок 1 – Вариант задания

Осуществлено подключение к PostgreSQL, выведены параметры подключения (Рисунок 2).

Рисунок 2 – Подключение к БД

Создана таблица locations, в нее добавлена запись, осуществлен вывод содержимого таблицы в Python и DBeaver (Рисунок 3).

Рисунок 3 – Создание таблицы

В таблицу были добавлены записи (Рисунок 4).

Рисунок 4 – Добавление записей

Для заполнения нового столбца создан курсор, проходящий по всем записям в таблице и вставляющий в location_id случайное значение из таблицы locations (Рисунок 5).

Рисунок 5 – Заполнение location_id

На рисунке 6 представлена обновленная схема данных.

Рисунок 6 – Обновленная схема данных

Выполнено 3 запроса (Рисунок 7 - 10):

- Найти сотрудника, который имеет зарплату равную минимальной зарплате по его должности.

- Найти сотрудника с минимальной зарплатой среди всех сотрудников. Имя и

фамилию вывести в одной колонке, дать имя колонке «worker».

- Найти всех сотрудников в Tokyo

Рисунок 7 – Код запросов

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

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

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

Создана и выполнена функция select_data (Рисунок 11).

Рисунок 11 – Функция select_data

Функция select_data была вызвана в python (Рисунок 12).

Рисунок 12 – Вызов функции в Python

Аналогичная функция select_data1 создана средствами Python (Рисунок 13, 14).

Рисунок 13 – Создание функции средствами Python

Рисунок 14 – Вызов функции select_data1 с параметром 20

Написана функция, возвращающая среднюю зарплату работников в указанном городе (Рисунок 15 - 18).

Рисунок 15 – Код функции

Рисунок 16 – Выбор города

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

Рисунок 18 – Код для создания функции через Python

Вывод:

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

Список используемых источников:

1. A.В. Аграновский, В.В. Боженко, Е.Л. Турнецкая. - Учебно-методическое пособие «Разработка и администрирование базы данных с открытым исходным кодом» ‒ СПб.: ГУАП, 2022

2. Документация DBeaver, URL: https://dbeaver.com/docs/dbeaver/ (Дата обращения 26.02.2024).

3. Документация PostgreSQL, URL: https://www.postgresql.org/docs/ (Дата обращения 26.02.2024).

4. Документация Python, URL: https://docs.python.org/3/ (Дата обращения 26.02.2024).

ПРИЛОЖЕНИЕ

Листинг кода Python:

import pandas as pd

import psycopg2

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

connection = psycopg2.connect(

database="students",

user="postgres",

password="root",

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")

cursor.execute(

'''

CREATE TABLE if not exists locations(

location_id int PRIMARY KEY,

city varchar(30),

postal_code varchar(12)

)

;

'''

)

cursor.execute(

'''

INSERT INTO locations

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')

;

'''

)

cursor.execute(

'''

ALTER TABLE employees

ADD location_id int

;

'''

)

cursor.execute(

'''

ALTER TABLE employees

ADD FOREIGN KEY (location_id) REFERENCES locations(location_id)

;

'''

)

cursor.execute(

'''

DO $$

DECLARE

record_id integer;

new_location_id integer;

record RECORD;

cur CURSOR FOR SELECT employee_id FROM employees;

BEGIN

OPEN cur;

LOOP

FETCH cur INTO record_id;

EXIT WHEN NOT FOUND;

SELECT location_id INTO new_location_id

FROM locations

ORDER BY random()

LIMIT 1;

UPDATE employees

SET location_id = new_location_id

WHERE employee_id = record_id;

END LOOP;

CLOSE cur;

END $$;

'''

)

connection.commit()

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

print(table_locations)

salary=pd.read_sql_query('''

SELECT employee_id,

first_name,

last_name,

job_id,

salary,

manager_id,

department_id,

location_id

FROM employees e

WHERE salary=(SELECT min_salary FROM jobs WHERE job_id = e.job_id)

;

''', connection)

print(salary)

worker=pd.read_sql_query('''

SELECT

CONCAT(first_name, ' ', last_name) AS worker,

salary

FROM employees

WHERE salary = (SELECT MIN(salary) FROM employees)

;

''',connection)

print(worker)

tokyo=pd.read_sql_query('''

SELECT e.employee_id, e.first_name, e.last_name

FROM employees e

JOIN locations l ON e.location_id = l.location_id

WHERE l.city = 'Tokyo'

;

''', connection)

print(tokyo)

cursor.callproc('select_data',[20,])

result = cursor.fetchall()

result_proc = pd.DataFrame(result)

print(result_proc)

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()

city_func = """

CREATE OR REPLACE FUNCTION average_salary_in_city(city_name text)

RETURNS numeric AS $$

SELECT AVG(e.salary)

FROM employees e

JOIN locations l ON e.location_id = l.location_id

WHERE l.city = city_name;

$$ LANGUAGE SQL;

"""

cursor.execute(city_func)

connection.commit()

connection.close()

cursor.close()

Соседние файлы в папке 6 семестр