
6 семестр / БД6
.docxГУАП
КАФЕДРА № 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()