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

SQLiteSQLiteBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы узнаете, как эффективно обрабатывать ошибки в базах данных SQLite. Основное внимание уделяется управлению нарушениями ограничений (constraint violations) во время операций INSERT с использованием предложения ON CONFLICT.

Вы начнете с создания базы данных и таблицы с ограничением UNIQUE. Затем вы изучите различные действия, которые можно предпринять при возникновении конфликта, такие как ROLLBACK, ABORT, FAIL, IGNORE или REPLACE, в частности, используя ON CONFLICT IGNORE для предотвращения вставки, когда нарушается ограничение уникальности (unique constraint). Лабораторная работа проведет вас через практические примеры вставки данных и обработки потенциальных ошибок.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sqlite(("SQLite")) -.-> sqlite/SQLiteGroup(["SQLite"]) sqlite/SQLiteGroup -.-> sqlite/init_db("Create SQLite Database") sqlite/SQLiteGroup -.-> sqlite/make_table("Create New Table") sqlite/SQLiteGroup -.-> sqlite/add_row("Insert Single Row") sqlite/SQLiteGroup -.-> sqlite/add_rows("Insert Multiple Rows") sqlite/SQLiteGroup -.-> sqlite/start_trans("Begin New Transaction") sqlite/SQLiteGroup -.-> sqlite/undo_trans("Rollback Transaction") subgraph Lab Skills sqlite/init_db -.-> lab-552550{{"Обработка ошибок в SQLite"}} sqlite/make_table -.-> lab-552550{{"Обработка ошибок в SQLite"}} sqlite/add_row -.-> lab-552550{{"Обработка ошибок в SQLite"}} sqlite/add_rows -.-> lab-552550{{"Обработка ошибок в SQLite"}} sqlite/start_trans -.-> lab-552550{{"Обработка ошибок в SQLite"}} sqlite/undo_trans -.-> lab-552550{{"Обработка ошибок в SQLite"}} end

Создание базы данных SQLite и таблицы с ограничением UNIQUE

На этом шаге вы создадите базу данных SQLite и таблицу с ограничением UNIQUE (уникальности). Это ограничение поможет вам понять, как обрабатывать ошибки при вставке повторяющихся данных.

Сначала откройте свой терминал в LabEx VM. Ваш путь по умолчанию - /home/labex/project.

Теперь давайте создадим базу данных SQLite с именем my_database.db. Выполните следующую команду, чтобы создать файл базы данных и открыть инструмент командной строки SQLite:

sqlite3 my_database.db

Вы увидите приглашение, указывающее на то, что вы находитесь внутри оболочки SQLite:

SQLite version 3.x.x
Enter ".help" for usage hints.
sqlite>

Далее создайте таблицу с именем users для хранения информации о пользователях. Эта таблица будет иметь три столбца: id, username и email. Столбец username будет иметь ограничение UNIQUE, что означает, что каждое имя пользователя должно быть уникальным в таблице. Введите следующую SQL-команду в командной строке sqlite> и нажмите Enter:

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT UNIQUE NOT NULL,
    email TEXT NOT NULL
);

Эта команда настраивает таблицу users, где:

  • id - это целое число, которое автоматически увеличивается для каждой новой записи. Ограничение PRIMARY KEY гарантирует, что каждый id является уникальным, а AUTOINCREMENT делает его автоматическим.
  • username - это текстовое поле, которое не может быть пустым (NOT NULL) и должно быть уникальным (UNIQUE).
  • email - это также текстовое поле, которое не может быть пустым (NOT NULL).

Вы не увидите никакого вывода, если команда выполнится успешно.

Вставка данных в таблицу

Теперь, когда вы создали таблицу users, давайте добавим в нее некоторые данные. Мы вставим запись пользователя в таблицу.

Вставьте запись пользователя в таблицу users, выполнив эту команду в командной строке sqlite>:

INSERT INTO users (username, email) VALUES ('Alice', '[email protected]');

Эта команда добавляет строку в таблицу users.

  • INSERT INTO users (username, email) указывает, что вы вставляете данные в столбцы username и email таблицы users.
  • VALUES ('Alice', '[email protected]') предоставляет значения для вставки для каждой записи.

Чтобы подтвердить, что данные были добавлены правильно, выполните эту команду, чтобы просмотреть все записи в таблице:

SELECT * FROM users;

Ожидаемый вывод:

1|Alice|[email protected]

Этот вывод показывает id, username и email для записи. Команда SELECT * извлекает все столбцы из указанной таблицы.

Попытка вставить повторяющиеся данные

На этом шаге вы попытаетесь вставить запись с повторяющимся именем пользователя (duplicate username). Это нарушит ограничение UNIQUE (уникальности) и вызовет ошибку.

Выполните следующую команду в командной строке sqlite>:

INSERT INTO users (username, email) VALUES ('Alice', '[email protected]');

Вы увидите сообщение об ошибке, похожее на это:

Error: UNIQUE constraint failed: users.username

Это сообщение об ошибке указывает на то, что ограничение UNIQUE для столбца username было нарушено. SQLite предотвращает вставку повторяющихся имен пользователей для поддержания целостности данных.

Использование ON CONFLICT IGNORE для обработки нарушений ограничений

На этом шаге вы узнаете, как использовать предложение ON CONFLICT IGNORE для обработки нарушений ограничений (constraint violations). Это предложение указывает SQLite игнорировать вставку, если она нарушит ограничение.

Выполните следующую команду в командной строке sqlite>:

INSERT OR IGNORE INTO users (username, email) VALUES ('Alice', '[email protected]');

Эта команда пытается вставить новую запись с именем пользователя 'Alice'. Однако, поскольку используется предложение ON CONFLICT IGNORE, SQLite проигнорирует вставку, и ошибка не будет выдана.

Чтобы подтвердить, что повторяющаяся запись не была вставлена, выполните эту команду:

SELECT * FROM users;

Ожидаемый вывод:

1|Alice|[email protected]

Вывод показывает, что в таблице существует только исходная запись с именем пользователя 'Alice'. Повторяющаяся запись была проигнорирована.

Оператор INSERT OR IGNORE предоставляет способ предотвратить ошибки и поддерживать целостность данных при вставке данных, которые могут нарушать ограничения.

Использование ON CONFLICT REPLACE для обработки нарушений ограничений

На этом шаге вы узнаете, как использовать предложение ON CONFLICT REPLACE для обработки нарушений ограничений (constraint violations). Это предложение указывает SQLite заменить существующую запись новой записью, если это приведет к нарушению ограничения.

Выполните следующую команду в командной строке sqlite>:

INSERT OR REPLACE INTO users (id, username, email) VALUES (1, 'Alice', '[email protected]');

Эта команда пытается вставить новую запись с именем пользователя 'Alice'. Поскольку используется предложение ON CONFLICT REPLACE, SQLite заменит существующую запись новой записью. Обратите внимание, что в этом случае нам нужно указать id, так как REPLACE удалит старую строку и вставит новую.

Чтобы подтвердить, что запись была заменена, выполните эту команду:

SELECT * FROM users;

Ожидаемый вывод:

1|Alice|[email protected]

Вывод показывает, что адрес электронной почты для записи с именем пользователя 'Alice' был обновлен до [email protected].

Оператор INSERT OR REPLACE предоставляет способ обновления существующих записей с сохранением целостности данных.

Наконец, выйдите из оболочки SQLite:

.exit

Это закроет соединение с базой данных и вернет вас в терминал.

Итог

В этой лабораторной работе вы узнали, как эффективно обрабатывать ошибки в базах данных SQLite, уделяя особое внимание нарушениям ограничений (constraint violations) во время операций INSERT. Вы создали базу данных и таблицу с ограничением UNIQUE, вставили данные, а затем попытались вставить дублирующиеся данные, чтобы вызвать ошибку. Затем вы изучили, как использовать предложения ON CONFLICT IGNORE и ON CONFLICT REPLACE для обработки этих нарушений ограничений, что позволяет вам контролировать, как SQLite реагирует на потенциальные ошибки и поддерживает целостность данных.