Знакомство с SQLite

Файл 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);
✅ запросы к базе идут через ? (данные не склеиваются в строку запроса);
✅ прислан скриншот, где бот помнит имя.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева