Гид по технологиям

Базы данных в Python: простое приложение регистрации на SQLite

5 min read Python Обновлено 24 Dec 2025
Регистрация пользователей на Python с SQLite
Регистрация пользователей на Python с SQLite

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

Логотип Python слева и изображение базы данных в виде цилиндра справа.

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, чтобы посмотреть содержимое таблицы.

Окно 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.

Мини-методология разработки (быстрая инструкция)

  1. Спланируйте модель данных (поля, индексы, ограничения).
  2. Настройте локальную среду и автоматизированные тесты.
  3. Реализуйте регистрацию и хеширование пароля.
  4. Добавьте обработку ошибок и логирование.
  5. Выполните тестирование (юнит/интеграция) и ревью безопасности.
  6. Подготовьте план миграции на серверную СУБД, если ожидается рост.

Критерии приёмки

  • Пользователь может успешно зарегистрироваться с уникальным 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.

Краткие действия для старта:

  1. Создайте соединение и курсор.
  2. Создайте таблицу users с констрейнтом UNIQUE для email.
  3. Соберите данные, проверьте пароли и хешируйте их.
  4. Вставьте данные с помощью параметризованных запросов и обработайте IntegrityError.

Дополнительные ресурсы: официальная документация sqlite3 в Python и руководства по bcrypt/argon2 для безопасного хранения паролей.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как стать аналитиком маркетинговых исследований
Маркетинг

Как стать аналитиком маркетинговых исследований

Как управлять фильтрами Gmail — создание и примеры
Gmail

Как управлять фильтрами Gmail — создание и примеры

Что Reedsy научит о книгоиздании
Издательство

Что Reedsy научит о книгоиздании

Поиск твитов пользователя в Twitter (iOS)
Социальные сети

Поиск твитов пользователя в Twitter (iOS)

Исправить Диспетчер задач в Windows 11/10
Windows

Исправить Диспетчер задач в Windows 11/10

Shadowsocks через Outline: быстрая настройка
Безопасность

Shadowsocks через Outline: быстрая настройка