- •Теория Базы данных и sql
- •Контейнеризация и Docker
- •Rest api и проектирование
- •Машинное обучение
- •Асинхронное программирование
- •Мобильная разработка и безопасность
- •Архитектура приложений
- •Практические задания Задание 1: sql (анализ оценок студентов)
- •Выполнение:
- •Задание 2: Docker (запуск FastApi-приложения в контейнере) доделать
- •Задание 3: rest api / FastApi (проектирование api для курсов)
- •Задание 4: Машинное обучение (определить тип ml-задачи)
Выполнение:
SELECT students.name, students.group_name, grades.subject, grades.mark FROM students JOIN grades ON students.id = grades.student_id WHERE students.group_name LIKE ‘БВТ-2%’ AND grades.subject=’Информационные технологии’ AND grades.mark > 80 |
Пояснение:
в SELECT мы указываем не только столбцы из таблицы students, но и те столбцы, которые хотим использовать в присоединенной таблице grades
в JOIN мы указываем таблицу, которую хотим присоединить и условие, по которому она будет присоединяться, ТО ЕСТЬ это выглядит как то так:
после WHERE мы указываем, какие условия должны соблюдаться
LIKE - оператор, который позволяет ввести вариативность, то есть в данном случае group_name может быть таким: БВТ-20, БВТ-2025 и так далее. Знак % указывает на то, что после указанного шаблона может быть неопределенное количество произвольных знаков, а знак _ указывает что после шаблона может быть только один произвольный знак.
Ответы на вопросы:
JOIN используется для “слияния” двух таблиц по определенному условию
В WHERE указываются условия соответствия шаблону “БВТ-2” и неограниченное количество символов после него, далее идет проверка на наличие в списке графы Информационные технологии и балла по ней больше 80.
Данные студентов и оценки могут храниться в разных таблицах только если правильно настроены внешние и первичные ключи. При таком условии их можно соединить с помощью оператора JOIN.
Задание 2: Docker (запуск FastApi-приложения в контейнере) доделать
Условие: Дано FastAPI-приложение, которое запускается командой:
uvicorn main:app --host 0.0.0.0 --port 8000
Что нужно сделать:
Описать шаги в Dockerfile (инструкции: FROM, WORKDIR, COPY, RUN, CMD).
Что нужно объяснить:
Назначение каждой инструкции Dockerfile.
Зачем нужен базовый образ?
Почему зависимости устанавливаются внутри контейнера?
Зачем указывать --host 0.0.0.0?
Чем образ отличается от контейнера?
Выполнение:
FROM python:3.12 # указание основного образа
WORKDIR /app # указание рабочей директории
COPY requirements.txt . # Копирование файла с зависимостями
RUN pip install -r requirements.txt # Установка всех зависимостей, указанных в файле
# requirements.txt
COPY . . # Копирование всех файлов с хоста в контейнер
CMD uvicorn main:app --host 0.0.0.0 --port 8000 # Команда запуска FastAPI
# приложения
Файл requerements.txt:
FastAPI=<ver>
uvicorn=<ver>
Задание 3: rest api / FastApi (проектирование api для курсов)
Условие: Необходимо спроектировать REST API для сущности course.
Что нужно сделать:
Предложить URL и HTTP-методы для операций:
Получить список курсов.
Получить курс по id.
Создать курс.
Обновить название курса.
Удалить курс.
Что нужно объяснить:
Почему URL должен обозначать ресурс, а действие определяется HTTP-методом?
Выполнение:
from fastapi import FastAPI, HTTPException, Body
from typing import List, Dict, Any
app = FastAPI()
# Хранилище курсов
courses = []
next_id = 1
# 1. Получить список всех курсов
# GET /courses
@app.get("/courses")
def get_courses():
return courses
# 2. Получить курс по id
# GET /courses/{id}
@app.get("/courses/{id}")
def get_course_by_id(id: int):
for course in courses:
if course["id"] == id:
return course
raise HTTPException(status_code=404, detail="Course not found")
# 3. Создать новый курс
# POST /courses
@app.post("/courses")
def create_course(name: str = Body(...)):
global next_id
new_course = {"id": next_id, "name": name}
courses.append(new_course)
next_id += 1
return new_course
# 4. Обновить название курса
# PUT /courses/{id}
@app.put("/courses/{id}")
def update_course(id: int, name: str = Body(...)):
for course in courses:
if course["id"] == id:
course["name"] = name
return course
raise HTTPException(status_code=404, detail="Course not found")
# 5. Удалить курс
# DELETE /courses/{id}
@app.delete("/courses/{id}")
def delete_course(id: int):
for i, course in enumerate(courses):
if course["id"] == id:
del courses[i]
return {"message": f"Course with id {id} deleted successfully"}
raise HTTPException(status_code=404, detail="Course not found")
REST API строится вокруг ресурсов (обьект системы, к которому можно обратииться через URL), а действия выполняются HTTP методами
