Tratamento de Erros SQLite

SQLiteBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como lidar efetivamente com erros em bancos de dados SQLite. O foco principal é o gerenciamento de violações de restrições durante operações INSERT usando a cláusula ON CONFLICT.

Você começará criando um banco de dados e uma tabela com uma restrição UNIQUE. Em seguida, explorará diferentes ações que podem ser tomadas quando um conflito ocorre, como ROLLBACK, ABORT, FAIL, IGNORE ou REPLACE, especificamente usando ON CONFLICT IGNORE para evitar a inserção quando uma restrição única é violada. O laboratório irá guiá-lo através de exemplos práticos de inserção de dados e tratamento de erros potenciais.

Criar um Banco de Dados SQLite e Tabela com uma Restrição UNIQUE

Nesta etapa, você criará um banco de dados SQLite e uma tabela com uma restrição UNIQUE. Essa restrição ajudará você a entender como lidar com erros ao inserir dados duplicados.

Primeiro, abra seu terminal na VM LabEx. Seu caminho padrão é /home/labex/project.

Agora, vamos criar um banco de dados SQLite chamado my_database.db. Execute o seguinte comando para criar o arquivo do banco de dados e abrir a ferramenta de linha de comando SQLite:

sqlite3 my_database.db

Você verá um prompt indicando que agora está dentro do shell SQLite:

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

Em seguida, crie uma tabela chamada users para armazenar informações do usuário. Esta tabela terá três colunas: id, username e email. A coluna username terá uma restrição UNIQUE, o que significa que cada nome de usuário deve ser único dentro da tabela. Digite o seguinte comando SQL no prompt sqlite> e pressione Enter:

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

Este comando configura a tabela users onde:

  • id é um inteiro que aumenta automaticamente para cada nova entrada. A restrição PRIMARY KEY garante que cada id seja único, e AUTOINCREMENT faz com que ele aumente automaticamente.
  • username é um campo de texto que não pode ser deixado vazio (NOT NULL) e deve ser único (UNIQUE).
  • email também é um campo de texto que não pode ser deixado vazio (NOT NULL).

Você não verá nenhuma saída se o comando for executado com sucesso.

Inserir Dados na Tabela

Agora que você criou a tabela users, vamos adicionar alguns dados a ela. Inseriremos um registro de usuário na tabela.

Insira um registro de usuário na tabela users executando este comando no prompt sqlite>:

INSERT INTO users (username, email) VALUES ('Alice', 'alice@example.com');

Este comando adiciona uma linha à tabela users.

  • INSERT INTO users (username, email) especifica que você está inserindo dados nas colunas username e email da tabela users.
  • VALUES ('Alice', 'alice@example.com') fornece os valores a serem inseridos para cada registro.

Para confirmar se os dados foram adicionados corretamente, execute este comando para visualizar todos os registros na tabela:

SELECT * FROM users;

Saída Esperada:

1|Alice|alice@example.com

Esta saída mostra o id, username e email para o registro. O comando SELECT * recupera todas as colunas da tabela especificada.

Tentar Inserir Dados Duplicados

Nesta etapa, você tentará inserir um registro com um nome de usuário duplicado. Isso violará a restrição UNIQUE e causará um erro.

Execute o seguinte comando no prompt sqlite>:

INSERT INTO users (username, email) VALUES ('Alice', 'alice2@example.com');

Você verá uma mensagem de erro semelhante a esta:

Error: UNIQUE constraint failed: users.username

Esta mensagem de erro indica que a restrição UNIQUE na coluna username foi violada. O SQLite impede a inserção de nomes de usuário duplicados para manter a integridade dos dados.

Usar ON CONFLICT IGNORE para Lidar com Violações de Restrição

Nesta etapa, você aprenderá como usar a cláusula ON CONFLICT IGNORE para lidar com violações de restrições. Esta cláusula informa ao SQLite para ignorar a inserção se ela violar uma restrição.

Execute o seguinte comando no prompt sqlite>:

INSERT OR IGNORE INTO users (username, email) VALUES ('Alice', 'alice2@example.com');

Este comando tenta inserir um novo registro com o nome de usuário 'Alice'. No entanto, como a cláusula ON CONFLICT IGNORE é usada, o SQLite ignorará a inserção e nenhum erro será gerado.

Para confirmar que o registro duplicado não foi inserido, execute este comando:

SELECT * FROM users;

Saída Esperada:

1|Alice|alice@example.com

A saída mostra que apenas o registro original com o nome de usuário 'Alice' existe na tabela. O registro duplicado foi ignorado.

A instrução INSERT OR IGNORE fornece uma maneira de evitar erros e manter a integridade dos dados ao inserir dados que podem violar restrições.

Usar ON CONFLICT REPLACE para Lidar com Violações de Restrição

Nesta etapa, você aprenderá como usar a cláusula ON CONFLICT REPLACE para lidar com violações de restrições. Esta cláusula informa ao SQLite para substituir o registro existente pelo novo registro se ele violar uma restrição.

Execute o seguinte comando no prompt sqlite>:

INSERT OR REPLACE INTO users (id, username, email) VALUES (1, 'Alice', 'alice3@example.com');

Este comando tenta inserir um novo registro com o nome de usuário 'Alice'. Como a cláusula ON CONFLICT REPLACE é usada, o SQLite substituirá o registro existente pelo novo registro. Observe que precisamos especificar o id neste caso, pois REPLACE irá deletar a linha antiga e inserir uma nova.

Para confirmar que o registro foi substituído, execute este comando:

SELECT * FROM users;

Saída Esperada:

1|Alice|alice3@example.com

A saída mostra que o endereço de e-mail para o registro com o nome de usuário 'Alice' foi atualizado para alice3@example.com.

A instrução INSERT OR REPLACE fornece uma maneira de atualizar registros existentes, mantendo a integridade dos dados.

Finalmente, saia do shell do SQLite:

.exit

Isso fechará a conexão com o banco de dados e o retornará ao terminal.

Resumo

Neste laboratório, você aprendeu como lidar efetivamente com erros em bancos de dados SQLite, com foco em violações de restrições durante operações INSERT. Você criou um banco de dados e uma tabela com uma restrição UNIQUE, inseriu dados e, em seguida, tentou inserir dados duplicados para acionar um erro. Em seguida, você explorou como usar as cláusulas ON CONFLICT IGNORE e ON CONFLICT REPLACE para lidar com essas violações de restrições, permitindo que você controle como o SQLite responde a possíveis erros e mantenha a integridade dos dados.