Базы данных в Python: простое приложение регистрации на SQLite
Ниже — пошаговое руководство по созданию простого приложения регистрации пользователей на Python с использованием SQLite. Показаны подключение к базе, создание таблицы, проверка пароля и уникальности email, вставка данных, базовые меры безопасности и варианты масштабирования.

Python имеет встроенную поддержку работы с базами данных в стандартной библиотеке, поэтому вы можете создать и использовать базу без внешних фреймворков, например Django ORM. SQLite лёгкая и удобная для интеграции с Python. В этом материале вы познакомитесь с основами программирования баз данных в Python на примере простого приложения регистрации пользователей.
Основные понятия
- Соединение (connection): объект, который открывает файл базы данных и управляет транзакциями. В sqlite3 это sqlite3.Connection.
- Курсор (cursor): объект для выполнения SQL-запросов в рамках соединения. В sqlite3 это sqlite3.Cursor.
Как создать базу данных в Python
Код из этого руководства доступен в репозитории на GitHub — используйте его как ориентир.
Чтобы создать или открыть базу данных SQLite, нужно получить соединение. Если файла базы нет, SQLite создаст его автоматически.
import sqlite3
# Открыть (или создать) базу
conn = sqlite3.connect('path/to/database.db')
# Закрыть соединение
conn.close()Важно закрывать соединение после работы, чтобы освободить ресурсы и зафиксировать транзакции.
Курсор
Курсор позволяет запускать SQL-операторы. Создайте его так:
cursor = conn.cursor()
# Закрыть курсор
cursor.close()Всегда создавайте курсор от активного соединения и закрывайте его, когда он больше не нужен.
Как выполнить SQL-транзакцию
Через курсор можно выполнить одиночные запросы, пакетные вставки или целые SQL-скрипты.
- cursor.execute — выполнить один SQL-запрос.
- cursor.executemany — выполнить один запрос многократно с разными параметрами.
- cursor.executescript — выполнить несколько SQL-операторов из одного текста.
Примеры:
# Создать таблицу (один запрос)
cursor.execute(
"""
CREATE TABLE IF NOT EXISTS users (
name TEXT,
age INTEGER
)
"""
)# Вставить несколько записей
data = [
('Alice', 25),
('Bob', 30),
('Charlie', 22)
]
cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", data)# Выполнить SQL-скрипт из файла
with open("path/to/script.sql") as file:
sql_script = file.read()
cursor.executescript(sql_script)После операций записи не забудьте вызвать conn.commit(), если только вы не используете executescript с COMMIT в самом SQL-файле.
Пошаговое создание приложения регистрации
Ниже — рабочий минималистичный пример логики регистрации. Код читаемый и пригоден для учебных целей.
Шаг 1: Подключение к базе
import sqlite3
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
# Код приложения здесь
cursor.close()
conn.close()Шаг 2: Создание таблицы пользователей
cursor.execute(
"""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
password TEXT NOT NULL
)
"""
)
conn.commit()Здесь поле email отмечено как UNIQUE, чтобы предотвратить дублирование учётных записей.
Шаг 3: Сбор данных пользователя
Организуйте ввод в отдельной функции, чтобы повторно использовать логику.
def register_user():
first_name = input("Введите имя: ")
last_name = input("Введите фамилию: ")
email = input("Введите email: ")
password1 = input("Введите пароль: ")
password2 = input("Подтвердите пароль: ")
return first_name, last_name, email, password1, password2Шаг 4: Проверка совпадения паролей
Попросите пользователя ввести пароль дважды и проверяйте совпадение в цикле.
while True:
first_name, last_name, email, password1, password2 = register_user()
if password1 != password2:
print("Пароли не совпадают. Попробуйте снова.")
continue
# Дальше — проверка и сохранение
breakШаг 5: Проверка уникальности email и обработка ошибок
При вставке данных база может выбросить sqlite3.IntegrityError, если email уже существует. Обработайте это исключение и попросите пользователя попробовать с другим адресом.
import sqlite3
try:
cursor.execute(
"INSERT INTO users (first_name, last_name, email, password) VALUES (?, ?, ?, ?)",
(first_name, last_name, email, password2)
)
conn.commit()
print("Учётная запись успешно создана.")
except sqlite3.IntegrityError:
print("Ошибка: этот email уже зарегистрирован.")Шаг 6: Вставка данных в базу
Комбинируя предыдущие шаги, вы получаете полноценную логику регистрации: сбор, валидация, попытка вставки и обработка ошибок.
После успешной регистрации вы можете открыть базу в GUI-редакторе, например DB Browser for SQLite, чтобы посмотреть содержимое таблицы.
Практические улучшения и безопасность (обязательные для продакшена)
Важно: хранить пароли в открытом виде опасно. Даже для учебного проекта лучше использовать хеширование с солью.
- Используйте проверенные библиотеки: bcrypt, argon2-cffi или passlib. Они реализуют адаптивные алгоритмы хеширования.
- Никогда не храните пароль как plain text.
- Дополнительно применяйте проверку сложности пароля (длина, набор символов) и подтверждение через email в продакшене.
Пример с bcrypt (требуется установка библиотеки: pip install bcrypt):
import bcrypt
password = "user_password".encode('utf-8')
salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(password, salt)
# Сохраните hashed в базе (bytes или закодированную строку)
# Проверка пароля при логине
if bcrypt.checkpw(password, hashed):
print("Пароль верный")Дополнительно:
- Ограничьте попытки входа.
- Используйте TLS для передачи данных между клиентом и сервером.
- Применяйте подготовленные выражения (параметры ? в sqlite3), чтобы избежать SQL-инъекций.
Когда SQLite подходит, а когда нет
Когда SQLite — хорошее решение:
- Небольшие приложения, десктопные утилиты, прототипы.
- Однопросессные или небольшие многопользовательские сценарии.
- Лёгкая интеграция и отсутствие необходимости в отдельном сервере.
Когда стоит выбрать другое решение:
- Высокая нагрузка, много параллельных записей — переходите на PostgreSQL/MySQL.
- Нужно богатое управление схемой, репликация, бэкапы и права доступа на уровне сервера.
- Требуется ORM с мощной моделью (SQLAlchemy, Django ORM).
Альтернативные подходы
- Django ORM — быстрый путь к полноценному веб-приложению с пользователями, миграциями и панелью администратора.
- SQLAlchemy — гибкая ORM/SQL-алхимия для проектов с кастомной логикой БД.
- TinyDB/JSON storage — для очень простых локальных приложений без SQL.
Мини-методология разработки (быстрая инструкция)
- Спланируйте модель данных (поля, индексы, ограничения).
- Настройте локальную среду и автоматизированные тесты.
- Реализуйте регистрацию и хеширование пароля.
- Добавьте обработку ошибок и логирование.
- Выполните тестирование (юнит/интеграция) и ревью безопасности.
- Подготовьте план миграции на серверную СУБД, если ожидается рост.
Критерии приёмки
- Пользователь может успешно зарегистрироваться с уникальным email.
- Пароли не сохраняются в открытом виде.
- При попытке зарегистрировать существующий email система выдаёт понятную ошибку.
- Ввод валидируется (непустые имена, корректный формат email).
- Логи событий регистрации доступны для отладки.
Чек-лист перед выпуском в продакшн
Для разработчика:
- Хеширование паролей (bcrypt/argon2) внедрено
- Подготовлены тесты на регистрацию и обработку ошибок
- Ограничение частоты попыток регистрации/логина
Для DevOps:
- План бэкапа/восстановления базы
- Мониторинг здоровья приложения и свободного места на диске
Для инженера по безопасности:
- TLS везде, где передаются пароли или личные данные
- Ревью логов на предмет утечек секретов
Тестовые случаи / Критерии приёмки (примеры)
- Успешная регистрация: валидные данные — запись в бд, код 200/OK.
- Дублирование email: попытка — IntegrityError, пользователь видит сообщение.
- Несовпадение паролей: система просит повторить ввод.
- Пустые поля: система отклоняет ввод и показывает подсказку.
Модель принятия решений: SQLite или СУБД-сервер
flowchart TD
A[Начало проекта] --> B{Ожидается рост?}
B -- Нет --> C[Использовать SQLite]
B -- Да --> D{Нужны транзакции/репликация?}
D -- Да --> E[PostgreSQL / MySQL]
D -- Нет --> F[SQLAlchemy + любая СУБД]
C --> G[Разрабатывать локальную логику и тесты]
E --> G
F --> GСоветы по миграции и совместимости
- При переходе с SQLite на PostgreSQL учтите различия в типах данных (BOOLEAN, AUTOINCREMENT/SEQUENCE).
- Тестируйте миграции на тестовой базе до релиза.
- Используйте миграционные инструменты: Alembic (SQLAlchemy) или встроенные миграции Django.
Когда низкоуровневый подход не годится
Контрпримеры и ограничения:
- Если вам нужен многопоточный или многоинстансный доступ с высокой нагрузкой, SQLite быстро станет узким местом.
- Без централизованного бэкапа восстановление после сбоя будет сложнее.
Резюме
SQLite отлично подходит для учебных проектов, небольших сервисов и прототипов. Python предоставляет простой и надёжный API для работы с базой. Для продакшен-систем обязательно внедряйте хеширование паролей, обработку ошибок и план масштабирования. Если проект растёт, рассматривайте переход на серверную СУБД и использование ORM.
Краткие действия для старта:
- Создайте соединение и курсор.
- Создайте таблицу users с констрейнтом UNIQUE для email.
- Соберите данные, проверьте пароли и хешируйте их.
- Вставьте данные с помощью параметризованных запросов и обработайте IntegrityError.
Дополнительные ресурсы: официальная документация sqlite3 в Python и руководства по bcrypt/argon2 для безопасного хранения паролей.
Похожие материалы
Как стать аналитиком маркетинговых исследований
Как управлять фильтрами Gmail — создание и примеры
Что Reedsy научит о книгоиздании
Поиск твитов пользователя в Twitter (iOS)
Исправить Диспетчер задач в Windows 11/10