Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к экзу ВвИТ 2 сем 1 курс.docx
Скачиваний:
0
Добавлен:
17.06.2026
Размер:
7.37 Mб
Скачать

Выполнение:

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 и так далее. Знак % указывает на то, что после указанного шаблона может быть неопределенное количество произвольных знаков, а знак _ указывает что после шаблона может быть только один произвольный знак.

Ответы на вопросы:

  1. JOIN используется для “слияния” двух таблиц по определенному условию

  2. В WHERE указываются условия соответствия шаблону “БВТ-2” и неограниченное количество символов после него, далее идет проверка на наличие в списке графы Информационные технологии и балла по ней больше 80.

  3. Данные студентов и оценки могут храниться в разных таблицах только если правильно настроены внешние и первичные ключи. При таком условии их можно соединить с помощью оператора 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-методы для операций:

  1. Получить список курсов.

  2. Получить курс по id.

  3. Создать курс.

  4. Обновить название курса.

  5. Удалить курс.

Что нужно объяснить:

  • Почему 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 методами