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

2 / пр1.docx

.pdf
Скачиваний:
1
Добавлен:
16.05.2025
Размер:
738.38 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ

КАФЕДРА №41

ОЦЕНКА

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

Доцент, к. т. н.

 

 

 

С. А. Чернышев

 

 

 

 

 

должность, уч. степень,

 

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

 

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

звание

 

 

 

 

 

 

Практическая работа №1

На тему: Работа c SQLite средствами ORM SQLAlchemy по дисциплине: Технологии программирования

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

 

 

 

 

СТУДЕНТКА ГР. №

Z0411

26.05.23

 

М. В. Карелина

 

 

 

 

 

 

 

номер

 

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

 

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

 

группы

 

 

Номер студенческого билета: 2020/3477

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

2023

Цель работы:

познакомиться с основными способами работы с SQLite средствами

ORM SQLAlchemy.

Вариант 8. Ресторанный бизнес.

Задание: Придумать и реализовать базу данных.

Структура данных приведена на Рис. 1.

Рисунок 1 – Схема данных Для начала установим библиотеку SQLAlchemy.

Напишем код программы:

Файл main.py:

import os

from database import DATABASE_NAME import create_db as db_creator

if __name__ == '__main__':

db_is_created = os.path.exists(DATABASE_NAME) if not db_is_created:

db_creator.create_db()

Файл database.py:

from sqlalchemy import create_engine

from sqlalchemy.orm import sessionmaker, declarative_base

DATABASE_NAME = 'Airport'

engine = create_engine(f'sqlite:///{DATABASE_NAME}') Base = declarative_base()

Session = sessionmaker(bind=engine)

def create_table(): Base.metadata.create_all(engine)

Файл tables.py:

from sqlalchemy import Column, Integer, String, Date, ForeignKey

from database import Base

class Clients(Base): __tablename__ = 'Clients'

clients_id = Column(Integer, primary_key=True) c_first_name = Column(String(50))

c_last_name = Column(String(50)) birth_date = Column(Date)

gender = Column(String(50))

def __repr__(self):

return f'Клиент [ID: {self.clients_id}, Имя: {self.c_first_name}' \ f', Фамилия: {self.c_last_name}, Дата рождения :

{self.birth_date}' \

f', Пол: {self. gender}]'

class Employees(Base): __tablename__ = 'Employees'

employees_id = Column(Integer, primary_key=True) e_first_name = Column(String(50))

e_last_name = Column(String(50)) post = Column(String(50))

def __repr__(self):

return f'Сотрудник [ID: {self.employees_id}, Имя: {self.e_first_name}' \

f', Фамилия: {self.e_last_name}, Должность : {self.post}]' class Order(Base):

__tablename__ = 'Order'

order_id = Column(Integer, primary_key=True)

o_client_id = Column(Integer, ForeignKey('Clients.clients_id')) o_employee_id = Column(Integer, ForeignKey('Employees.employees_id')) order_date = Column(Date)

def __repr__(self):

return f'Заказ [ID: {self.order_id}, ID Клиента: {self.o_client_id}'

\

f', ID Сотрудника: {self.o_employee_id}, Дата : {self.order_date}]'

class Feature(Base): __tablename__ = 'Feature'

feature_id = Column(Integer, primary_key=True)

client_id = Column(Integer, ForeignKey('Order.o_client_id')) employee_id = Column(Integer, ForeignKey('Order.o_employee_id')) order_id = Column(Integer, ForeignKey('Order.order_id'))

dish = Column(String(50)) price = Column(Integer)

def __repr__(self):

return f'Характеристики заказа [ID: {self.feature_id}, ID Клиента: {self.client_id}' \

f', ID Сотрудника: {self.employee_id}, ID Заказа : {self.order_id}' \

f', Блюдо: {self.dish}, Цена: {self.price}]]'

Файл create_db.py:

from faker import Faker

from tables import Clients, Employees, Order, Feature from database import create_table, Session

def create_db(): create_table() session = Session()

fake = Faker('ru_RU')

gender_list = ['М', 'Ж']

post = ['Официант_3', 'Официант_2', 'Администратор', 'Официант', 'Кассир_2',

'Кассир']

dish = ['Драники', 'Пицца', 'Тако', 'Токпокки', 'Омлет', 'Рамэн', 'Роллы', 'Чизкейк', 'Кекс', 'Тарт']

price = ['100', '200', '300', '400', '500', '600', '700', '800', '900', '1000']

for i in range(10): clients = Clients(

c_first_name = fake.first_name(), c_last_name = fake.last_name(), birth_date = fake.date_of_birth(), gender = fake.random.choice(gender_list)

)

session.add(clients)

session.commit()

fake = Faker('ru_RU')

for i in range(10): emplyees = Employees(

e_first_name = fake.first_name(), e_last_name = fake.last_name(), post = fake.random.choice(post)

)

session.add(emplyees)

session.commit()

fake = Faker('ru_RU')

for i in range(5): order = Order(

o_client_id = fake.random_int(1, 10), o_employee_id = fake.random_int(1, 10), order_date = fake.date_object()

)

session.add(order)

session.commit()

fake = Faker('ru_RU')

for i in range(15): feature = Feature(

client_id = fake.random_int(1, 10), employee_id = fake.random_int(1, 10), order_id = fake.random_int(1, 5), dish = fake.random.choice(dish), price = fake.random.choice(price)

)

session.add(feature)

session.commit()

session.close()

Результат выполнения:

Рисунок 1 - Выполнение кода

Напишем 10 запросов к БД и «положим» их в файл requests.py

from sqlalchemy import and_

from tables import Clients, Employees, Order, Feature from database import create_table, Session

session = Session()

for it in session.query(Clients): print(it)

print('=' * 200)

for it in session.query(Employees): print(it)

print('=' * 200)

for it in session.query(Order): print(it)

print('=' * 200)

for it in session.query(Feature): print(it)

print('=' * 200)

for it in session.query(Employees).filter(and_(Employees.employees_id >= 4, Employees.post.like('Кассир'))):

print(it) print('=' * 200)

for it in session.query(Order).join(Employees).filter(Employees.employees_id == 10):

print(it) print('=' * 200)

for it in session.query(Feature).filter(Feature.dish.like('Т%')): print(it)

print('=' * 200)

for it in session.query(Clients).filter(Clients.gender.like('М')): print(it)

print('=' * 200)

for it in session.query(Feature).filter(and_(Feature.feature_id >= 2, Feature.employee_id == 7)):

print(it) print('=' * 200)

for it in session.query(Clients).filter(and_(Clients.clients_id >= 4, Clients.gender.like('Ж'))):

print(it) print('=' * 200)

Результат выполнения:

Рисунок 3 - Выполнение запросов

Напишем тесты с помощью unittest.

Файл test3.py

from datetime import date

from tables import Employees, Clients from database import Session

import unittest

class TestEmployees(unittest.TestCase): def setUp(self):

self.session = Session()

def test_filter_employees_by_post(self):

# Получаем всех сотрудников с должностью "Официант"

waiters = self.session.query(Employees).filter(Employees.post == 'Официант').all()

# Проверяем, что в результате только один сотрудник self.assertEqual(len(waiters), 2)

def test_filter_clients_by_age(self):

# Получаем всех клиентов, родившихся после 1 января 1990 года young_clients = self.session.query(Clients).filter(Clients.birth_date

>= date(1990, 1, 1)).all()

# Проверяем, что в результате только два клиента self.assertEqual(len(young_clients), 2)

def test_filter_clients_by_gender(self):

# Получаем всех клиентов мужского пола

male_clients = self.session.query(Clients).filter(Clients.gender == 'М').all()

# Проверяем, что в результате только два клиента self.assertEqual(len(male_clients), 3)

if __name__ == '__main__': unittest.main()

Результат выполнения:

Рисунок 4 - Выполнение тестов

Созданная база данных:

Рисунок 2 - БД. Клиенты

Рисунок 6 - БД. Сотрудники

Рисунок 7 - БД. Характеристики

Рисунок 8 - БД. Заказы

Вывод

Я познакомилась с основными способами работы с SQLite средствами

ORM SQLAlchemy.

Соседние файлы в папке 2