
Информатика: создаём своего цифрового помощника Урок 52 из 72
SQL спрашивает данные точно
Зададим базе точный вопрос: какие занятия относятся к задаче и сколько минут они заняли.
Где мы на карте
Урок 52 из 72, блок «Данные, таблицы и базы» (47–54). Мы продолжаем помощника 1.1 с тремя вымышленными задачами. В конце блока его записи будут храниться в локальном SQLite, а проверенные правила напоминаний останутся прежними.
Ситуация и вопрос
Друг просит «найди занятия по чтению». База не понимает дружеского намёка: ей нужны имя таблицы, условие и порядок ответа. Один неверный символ ID может дать пустой результат, который нужно отличить от нуля минут.
Новые слова без пропусков
SQL — язык запросов к реляционным данным. SELECT выбирает столбцы, FROM называет таблицу, WHERE отбирает строки, ORDER BY задаёт порядок. SUM складывает, COUNT считает записи. Параметр запроса ? принимает значение отдельно от текста SQL; такой запрос не смешивает ввод пользователя с командой. Агрегация сводит несколько строк к итогу. Условие task_id = 't-01' возвращает две записи; сумма — 45 минут.
Опорный сигнал
Прочитайте схему слева направо. Для каждой стрелки назовите вход, преобразование и проверку. Закройте третий шаг и предскажите его. Затем найдите соответствующую строку в CSV, SQL или отчёте: нарисованная стрелка не должна подменять реальные значения и связи.
Разбираем шаг за шагом
Прочитайте запрос слева направо: SELECT minutes FROM study_sessions WHERE task_id = ? ORDER BY observed_on, параметр t-01. Результат — 20, затем 25. Поменяйте параметр на t-03: 15, затем 10. В Python передайте (task_id,), а не собирайте строку SQL из пользовательского текста. Запрос SELECT COUNT(*), SUM(minutes) ... даст для t-01 число записей 2 и сумму 45. Для t-02 COUNT(*) равен 0, а SUM без строк — NULL; их нельзя объявлять одним и тем же.
Предскажите и проверьте
Сначала запишите ожидаемый вывод точно, включая порядок строк. Затем выполните код из папки step-05 и сравните посимвольно. Измените один вход и повторите цикл «предсказать — запустить — объяснить». Пример доказывает только заявленное правило: он не превращает учебные вымышленные данные в измерение реальных людей.
from pathlib import Path
from tempfile import TemporaryDirectory
from data_store import create_database, connect_readonly
with TemporaryDirectory() as folder:
db = Path(folder) / "test.db"
create_database(db, "tasks.json", "study_sessions.csv")
with connect_readonly(db) as connection:
rows = connection.execute("SELECT minutes FROM study_sessions WHERE task_id = ? ORDER BY observed_on", ("t-01",)).fetchall()
print(*(row[0] for row in rows))
Ожидаемый вывод
20 25
Поймайте ошибку
ORDER BY не меняет сами минуты, только порядок строк. Отсутствие ORDER BY не обещает нужного порядка. Если вписать введённый текст непосредственно в SQL, специальные символы могут изменить смысл запроса; параметр отделяет данные от команды.
Изменение проекта
Добавьте в журнал три проверяемых запроса: список для t-01, сумму для t-03, число записей для t-02. Сверьте каждое число с исходным CSV.
Задание и доказательство
Предскажите строки для t-03. Объясните (task_id,) в Python: почему запятая важна для кортежа из одного значения? Сравните COUNT(*) и SUM(minutes) для задачи без сессий.
Перенос в новую ситуацию
В таблице выдачи книг запрос по ID книги вернул пустой список. Доказывает ли это, что книга существует, но ни разу не выдавалась? Как проверить существование книги отдельно?
Возврат через 1, 7 и 30 дней
Через 1 день восстановите схему по памяти и назовите случай, где простая аналогия не работает. Через 7 дней объясните новую таблицу товарищу без текста и ответьте минимум на 7 из 10 вопросов итогового урока. Через 30 дней повторите импорт во временную папку и проверьте три задачи, четыре занятия, сумму 70 и неизменные напоминания. Запишите оставшийся непонятным термин и вернитесь к его первому определению.
Первоисточник для проверки
Следующий урок
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.