
2 / пр1.docx
.pdfМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА №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.