Manejo de Errores en SQLite

SQLiteSQLiteBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo manejar eficazmente los errores en las bases de datos SQLite. El enfoque principal es la gestión de violaciones de restricciones durante las operaciones INSERT utilizando la cláusula ON CONFLICT.

Comenzará creando una base de datos y una tabla con una restricción UNIQUE. Luego, explorará las diferentes acciones que se pueden tomar cuando ocurre un conflicto, como ROLLBACK, ABORT, FAIL, IGNORE o REPLACE, específicamente utilizando ON CONFLICT IGNORE para evitar la inserción cuando se viola una restricción única. El laboratorio lo guiará a través de ejemplos prácticos de inserción de datos y manejo de posibles errores.


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{{"Manejo de Errores en SQLite"}} sqlite/make_table -.-> lab-552550{{"Manejo de Errores en SQLite"}} sqlite/add_row -.-> lab-552550{{"Manejo de Errores en SQLite"}} sqlite/add_rows -.-> lab-552550{{"Manejo de Errores en SQLite"}} sqlite/start_trans -.-> lab-552550{{"Manejo de Errores en SQLite"}} sqlite/undo_trans -.-> lab-552550{{"Manejo de Errores en SQLite"}} end

Crear una base de datos SQLite y una tabla con una restricción UNIQUE

En este paso, creará una base de datos SQLite y una tabla con una restricción UNIQUE. Esta restricción le ayudará a comprender cómo manejar los errores al insertar datos duplicados.

Primero, abra su terminal en la VM de LabEx. Su ruta predeterminada es /home/labex/project.

Ahora, vamos a crear una base de datos SQLite llamada my_database.db. Ejecute el siguiente comando para crear el archivo de la base de datos y abrir la herramienta de línea de comandos de SQLite:

sqlite3 my_database.db

Verá un indicador que muestra que ahora está dentro del shell de SQLite:

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

A continuación, cree una tabla llamada users para almacenar información del usuario. Esta tabla tendrá tres columnas: id, username y email. La columna username tendrá una restricción UNIQUE, lo que significa que cada nombre de usuario debe ser único dentro de la tabla. Ingrese el siguiente comando SQL en el prompt sqlite> y presione Enter:

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

Este comando configura la tabla users donde:

  • id es un entero que aumenta automáticamente para cada nueva entrada. La restricción PRIMARY KEY asegura que cada id sea único, y AUTOINCREMENT hace que aumente automáticamente.
  • username es un campo de texto que no puede dejarse vacío (NOT NULL) y debe ser único (UNIQUE).
  • email también es un campo de texto que no puede dejarse vacío (NOT NULL).

No verá ninguna salida si el comando se ejecuta correctamente.

Insertar datos en la tabla

Ahora que ha creado la tabla users, agreguemos algunos datos. Insertaremos un registro de usuario en la tabla.

Inserte un registro de usuario en la tabla users ejecutando este comando en el prompt sqlite>:

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

Este comando agrega una fila a la tabla users.

  • INSERT INTO users (username, email) especifica que está insertando datos en las columnas username y email de la tabla users.
  • VALUES ('Alice', '[email protected]') proporciona los valores que se insertarán para cada registro.

Para confirmar que los datos se agregaron correctamente, ejecute este comando para ver todos los registros en la tabla:

SELECT * FROM users;

Resultado esperado:

1|Alice|[email protected]

Esta salida muestra el id, username y email para el registro. El comando SELECT * recupera todas las columnas de la tabla especificada.

Intentar insertar datos duplicados

En este paso, intentará insertar un registro con un nombre de usuario (username) duplicado. Esto violará la restricción UNIQUE y causará un error.

Ejecute el siguiente comando en el prompt sqlite>:

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

Verá un mensaje de error similar a este:

Error: UNIQUE constraint failed: users.username

Este mensaje de error indica que se ha violado la restricción UNIQUE en la columna username. SQLite impide la inserción de nombres de usuario duplicados para mantener la integridad de los datos.

Usar ON CONFLICT IGNORE para manejar violaciones de restricciones

En este paso, aprenderá a usar la cláusula ON CONFLICT IGNORE para manejar las violaciones de restricciones (constraint violations). Esta cláusula le indica a SQLite que ignore la inserción si viola una restricción.

Ejecute el siguiente comando en el prompt sqlite>:

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

Este comando intenta insertar un nuevo registro con el nombre de usuario 'Alice'. Sin embargo, debido a que se utiliza la cláusula ON CONFLICT IGNORE, SQLite ignorará la inserción y no se generará ningún error.

Para confirmar que el registro duplicado no se insertó, ejecute este comando:

SELECT * FROM users;

Resultado esperado:

1|Alice|[email protected]

El resultado muestra que solo el registro original con el nombre de usuario 'Alice' existe en la tabla. El registro duplicado fue ignorado.

La declaración INSERT OR IGNORE proporciona una forma de evitar errores y mantener la integridad de los datos al insertar datos que podrían violar las restricciones.

Usar ON CONFLICT REPLACE para manejar violaciones de restricciones

En este paso, aprenderá a usar la cláusula ON CONFLICT REPLACE para manejar las violaciones de restricciones (constraint violations). Esta cláusula le indica a SQLite que reemplace el registro existente con el nuevo registro si este viola una restricción.

Ejecute el siguiente comando en el prompt sqlite>:

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

Este comando intenta insertar un nuevo registro con el nombre de usuario 'Alice'. Debido a que se utiliza la cláusula ON CONFLICT REPLACE, SQLite reemplazará el registro existente con el nuevo registro. Tenga en cuenta que necesitamos especificar el id en este caso, ya que REPLACE eliminará la fila antigua e insertará una nueva.

Para confirmar que el registro fue reemplazado, ejecute este comando:

SELECT * FROM users;

Resultado esperado:

1|Alice|[email protected]

El resultado muestra que la dirección de correo electrónico (email address) para el registro con el nombre de usuario 'Alice' se ha actualizado a [email protected].

La declaración INSERT OR REPLACE proporciona una forma de actualizar los registros existentes manteniendo la integridad de los datos.

Finalmente, salga del shell de SQLite:

.exit

Esto cerrará la conexión a la base de datos y lo devolverá a la terminal.

Resumen

En este laboratorio, ha aprendido cómo manejar eficazmente los errores en las bases de datos SQLite, centrándose en las violaciones de restricciones (constraint violations) durante las operaciones INSERT. Creó una base de datos y una tabla con una restricción UNIQUE, insertó datos y luego intentó insertar datos duplicados para provocar un error. A continuación, exploró cómo usar las cláusulas ON CONFLICT IGNORE y ON CONFLICT REPLACE para manejar estas violaciones de restricciones, lo que le permite controlar cómo responde SQLite a los posibles errores y mantener la integridad de los datos.