Файл JSON отлично работает, пока данных немного. Но представь бота на тысячу человек, у каждого имя, счёт, настройки. Искать нужного в одном большом файле станет медленно. Для такого придумали базы данных. Знакомимся с самой простой, SQLite, на уровне «потрогать и понять».
После урока сможешь: объяснить тему «Знакомство с SQLite» и выполнить связанный с ней учебный шаг без подсказки.
Этот урок — знакомство и необязательная ступенька. Твоя миссия темы 5 (Бот-Памятка на JSON) засчитывается и без SQLite. Здесь мы просто трогаем настоящую базу данных, чтобы ты понял, куда расти.
Что такое SQLite
SQLite это настоящая база данных, которая живёт в одном файле рядом с твоей программой. Не нужен отдельный сервер, не нужна установка. Один файл, например pamyat.db, и в нём аккуратные таблицы, как в Excel: строки и столбцы.
Таблица users (файл базы: pamyat.db) +-----------------------+----------------+ | id | imya | | TEXT, PRIMARY KEY | TEXT | +=======================+================+ | 123 | Аня | | 456 | Пётр | | 789 | Лена | +-----------------------+----------------+ Столбцы (id, imya) - это поля. Строка - один человек. id - ключ: у каждого свой и не повторяется. Так база создаёт таблицу: CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, imya TEXT)
Сравни тетрадку и картотеку. JSON-файл это тетрадка: всё подряд, ищешь глазами. База это картотека с ящичками и подписями. Хочешь найти человека — открываешь ящик по его подписи и сразу достаёшь карточку, не листая всё подряд. База так же мгновенно находит запись по
id. Для маленького бота хватит тетрадки, для большого удобнее картотека.
Модуль уже встроен
Приятная новость: SQLite встроен в Python, ставить ничего не надо. Подключаем: import sqlite3. Сделаем две функции: сохранить имя и достать имя. Открываем и закрываем базу на каждой операции, так проще и не словишь ошибку из-за того, что бот обрабатывает сообщения в несколько потоков.
import sqlite3
def sohranit_imya(user_id, imya):
conn = sqlite3.connect("pamyat.db")
conn.execute("CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, imya TEXT)")
conn.execute("INSERT OR REPLACE INTO users (id, imya) VALUES (?, ?)", (user_id, imya))
conn.commit()
conn.close()
def vzyat_imya(user_id):
conn = sqlite3.connect("pamyat.db")
conn.execute("CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, imya TEXT)")
row = conn.execute("SELECT imya FROM users WHERE id = ?", (user_id,)).fetchone()
conn.close()
if row:
return row[0]
return None
Разберём по строчкам
Команды для базы пишут на особом языке — он называется SQL (по-английски Structured Query Language, «язык запросов к базам»). Он короткий, разберём прямо тут. Кстати, во «взрослых» примерах для SQLite часто заводят отдельный курсор — это как указатель, который бегает по строкам таблицы. Нам он сейчас не нужен: conn.execute(...) и так всё делает сам.
sqlite3.connect("pamyat.db")открывает базу-файл (нет файла — создастся).connэто соединение.CREATE TABLE IF NOT EXISTS users (...)создаёт таблицу users, если её ещё нет: столбцы id (кто) и imya (как зовут). PRIMARY KEY значит, что id у каждого свой.INSERT OR REPLACEкладёт запись: нет такого id — добавит, есть — заменит. Удобно: не думаешь, новый игрок или старый.SELECT imya FROM users WHERE id = ?достаёт имя нужного id. Результат берём черезfetchone()— это одна строка таблицы в виде кортежа (набор значений, как список, только менять нельзя). Имя лежит первым, поэтому берёмrow[0]. Если записи нет,fetchone()вернётNone.conn.commit()сохраняет изменения,conn.close()закрывает базу.
Как бот работает с базой (файл pamyat.db)
[1] Открыть -> [2] Создать -> [3] Вставить -> [4] Прочитать -> [5] Закрыть
1. Открыть conn = sqlite3.connect("pamyat.db")
2. Создать CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, imya TEXT)
3. Вставить INSERT OR REPLACE INTO users (id, imya) VALUES (?, ?)
(!) сохранить изменения: conn.commit()
4. Прочитать SELECT imya FROM users WHERE id = ? -> fetchone()
5. Закрыть conn.close()
Базу открываем и закрываем на каждой операции - так проще и без ошибок.
Промежуточная проверка. Прежде чем идти дальше, запусти файл и вызови один раз
sohranit_imya("1", "Аня"). Рядом с программой должен появиться файлpamyat.db, а красных ошибок в терминале — нет. Появился файл? ЗначитconnectиCREATE TABLEотработали, база создалась. Фундамент готов — дальше только читаем.
Заметил
?в запросах, а значения отдельно? Это привычка безопасности: данные пользователя не вклеиваем прямо в текст запроса, а передаём через?. Так хитрый пользователь не подсунет в базу вредную команду. Запомни: данные в запрос только через?, никогда не склейкой строк.
Что выбрать
Для твоих ботов на этом курсе файла JSON хватит с головой, он проще. SQLite держи в голове как следующий шаг: когда данных станет много, ты уже будешь знать, куда расти. Помнить по-настоящему мы научились, а инструмент выберешь под задачу.
Контрольный вопрос. В SQLite данные пользователя подставляют в запрос безопасно — через специальный символ вместо склейки строк. Напиши этот символ (один знак).
Подсказка: Плейсхолдер безопасности.
Онлайн-проверка ответа появится позже
Задание. Подключи sqlite3, сделай функции сохранить и достать имя, перепиши память Бот-Памятки на SQLite вместо файла JSON. Назови имя, перезапусти бота, проверь что помнит (данные теперь в файле pamyat.db). Пришли скриншот, где бот помнит имя.
Подсказка: CREATE TABLE IF NOT EXISTS, INSERT OR REPLACE для записи, SELECT для чтения. Открывай/закрывай базу на каждую операцию.
✅ Готово, если: ты ввёл(а) верный ответ, и онлайн-проверка его приняла.
Онлайн-проверка ответа появится позже
Зачёт (бонус), если:
✅ функции сохранить и достать имя на sqlite3 работают;
✅ Бот-Памятка переписана на SQLite и после перезапуска помнит имя (данные в файле pamyat.db);
✅ запросы к базе идут через ? (данные не склеиваются в строку запроса);
✅ прислан скриншот, где бот помнит имя.
