Работа с sqlite3 на Python

Назад на главную

Подключение к базе данных

import sqlite3  # Подключаем встроенный модуль sqlite3 для работы с SQLite

# Подключение к базе данных (если файла базы нет, он будет создан)
conn = sqlite3.connect('example.db')  # 'example.db' — имя файла базы данных
cursor = conn.cursor()  # Создаем объект курсора для выполнения SQL-запросов

Создание таблицы

# Создаем таблицу для хранения информации о пользователях
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (  # -- Создаем таблицу, если она еще не существует
    id INTEGER PRIMARY KEY AUTOINCREMENT,  # -- Уникальный идентификатор, автоинкремент
    username TEXT NOT NULL,  # -- Имя пользователя, обязательно для заполнения
    email TEXT UNIQUE NOT NULL,  # -- Email пользователя, обязательно и уникально
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  # -- Дата и время создания записи, по умолчанию текущая дата
)
''')

# Применяем изменения (фиксируем их в файле базы данных)
conn.commit()

Вставка данных

# Добавляем нового пользователя в таблицу
cursor.execute('''
INSERT INTO users (username, email)  # -- Указываем, какие поля заполняем
VALUES (?, ?)  # -- Место для подстановки значений (используем параметризованный запрос)
''', ('admin', 'admin@example.com'))  # Передаем значения для вставки

conn.commit()  # Сохраняем изменения в базе данных

Чтение данных

# Выполняем запрос на выборку всех записей из таблицы
cursor.execute('SELECT * FROM users')  # SQL-запрос без условий (выбирает все строки)
rows = cursor.fetchall()  # Получаем все строки результата

# Перебираем строки и выводим их
for row in rows:
    print(row)  # Каждая строка — это кортеж (id, username, email, created_at)

Обновление данных

# Обновляем email пользователя с определенным именем
cursor.execute('''
UPDATE users  # -- Обновляем данные в таблице
SET email = ?  # -- Задаем новое значение для поля email
WHERE username = ?  # -- Условие обновления: обновляем только для указанного username
''', ('new_admin@example.com', 'admin'))  # Передаем новое значение и имя пользователя

conn.commit()  # Сохраняем изменения

Удаление данных

# Удаляем запись о пользователе с определенным именем
cursor.execute('''
DELETE FROM users  # -- Удаляем данные из таблицы
WHERE username = ?  # -- Условие удаления: только для указанного username
''', ('admin',))  # Передаем значение для удаления

conn.commit()  # Применяем изменения

Закрытие соединения

# Закрываем соединение с базой данных, чтобы освободить ресурсы
conn.close()  # Это важно для предотвращения утечек ресурсов

Контекстный менеджер для упрощения работы

# Используем контекстный менеджер для автоматического закрытия соединения
with sqlite3.connect('example.db') as conn:  # Автоматически закрывает соединение по завершении блока
    cursor = conn.cursor()  # Создаем курсор
    cursor.execute('SELECT * FROM users')  # Выполняем запрос
    print(cursor.fetchall())  # Выводим все строки результата

Обработка ошибок

try:
    # Попытка подключения к базе данных
    conn = sqlite3.connect('example.db')  # Открываем соединение
    cursor = conn.cursor()  # Создаем курсор
    cursor.execute('SELECT * FROM non_existent_table')  # Выполняем запрос к несуществующей таблице
except sqlite3.Error as e:  # Ловим исключение SQLite
    print(f"Ошибка SQLite: {e}")  # Выводим сообщение об ошибке
finally:
    conn.close()  # Закрываем соединение даже в случае ошибки

Пример: Управление пользователями

import sqlite3  # Модуль для работы с SQLite

# Функция подключения к базе данных
def connect_db(db_name='example.db'):
    """
    Подключается к базе данных с указанным именем.
    Если файл базы отсутствует, он будет создан автоматически.
    """
    return sqlite3.connect(db_name)

# Функция для создания таблицы
def create_table():
    """
    Создает таблицу users для хранения информации о пользователях.
    Если таблица уже существует, повторное создание не производится.
    """
    with connect_db() as conn:  # Автоматическое закрытие соединения
        cursor = conn.cursor()
        cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT NOT NULL,
            email TEXT UNIQUE NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
        ''')
        conn.commit()  # Применяем изменения

# Функция для добавления пользователя
def add_user(username, email):
    """
    Добавляет нового пользователя в базу данных.
    """
    with connect_db() as conn:
        cursor = conn.cursor()
        try:
            cursor.execute('INSERT INTO users (username, email) VALUES (?, ?)', (username, email))
            conn.commit()
            print(f"Пользователь {username} успешно добавлен.")
        except sqlite3.IntegrityError as e:  # Обрабатываем ошибки целостности (например, повторный email)
            print(f"Ошибка добавления: {e}")

# Функция для отображения всех пользователей
def list_users():
    """
    Выводит список всех пользователей из базы данных.
    """
    with connect_db() as conn:
        cursor = conn.cursor()
        cursor.execute('SELECT * FROM users')  # Выбираем все записи
        for row in cursor.fetchall():  # Перебираем строки результата
            print(row)

# Основная функция программы
def main():
    """
    Основной сценарий: создание таблицы, добавление пользователя и вывод всех пользователей.
    """
    create_table()  # Создаем таблицу (если она еще не существует)
    add_user('admin', 'admin@example.com')  # Добавляем пользователя
    list_users()  # Отображаем список пользователей

# Запуск программы
if __name__ == '__main__':
    main()