CodeGym /Cursos /SQL SELF /Importar datos desde archivos CSV usando el comando `COPY...

Importar datos desde archivos CSV usando el comando `COPY`

SQL SELF
Nivel 23 , Lección 1
Disponible

¡Hola, colegas! Imagina que tienes una tabla de Excel con 10 000 filas y tu jefe te dice: "¡Carga esto en la base de datos!" Hmm... si intentas meter los datos a mano, pues... probablemente vas a necesitar no solo skills de SQL, sino también vacaciones. 😅

Por suerte, PostgreSQL tiene un comando que es como un teletransporte del CSV a la base — es COPY. Carga los datos al instante, en masa y sin dramas. Hoy vamos a ver cómo funciona COPY, cómo preparar los datos y qué hacer si en el archivo aparece una "coma flotante" o algún símbolo raro. ¡Vamos allá!

Básicos del comando COPY

COPY es un comando de PostgreSQL que te permite mover datos entre una tabla y el sistema de archivos. Es útil para cargar datos en masa a la base o para exportarlos.

Ejemplo de sintaxis de COPY para cargar datos en una tabla:

COPY table_name FROM 'path/to/your/file.csv' DELIMITER ',' CSV HEADER;

Parámetros principales:

  • FROM 'path/to/your/file.csv': define la ruta a tu archivo CSV.
  • DELIMITER ',': indica el carácter separador (en este caso, la coma).
  • CSV HEADER: indica que el archivo CSV tiene cabecera (la primera línea con los nombres de las columnas).

El comando COPY se ejecuta directamente en el servidor, lo que lo hace súper rápido cuando trabajas con grandes volúmenes de datos.

Diferencia entre COPY y \COPY

A veces puedes encontrarte con un poco de confusión entre COPY y \COPY.

  • COPY: se ejecuta en el lado del servidor. Se usa para cargar archivos que están en el servidor.
  • \COPY: comando del cliente, disponible en psql. La carga de datos se hace desde tu ordenador local.

Si trabajas en tu máquina local, lo más probable es que uses \COPY. Hablaremos de eso un poco más adelante.

Ejemplo de uso de COPY

Vamos directo a un ejemplo para entender mejor cómo funciona en la práctica.

Paso 1: Preparar la tabla

Imagina que creamos una tabla para guardar info sobre estudiantes:

CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    date_of_birth DATE,
    grade FLOAT
);

Paso 2: Preparar el archivo CSV

El formato de tu archivo CSV debe coincidir con la tabla. Ejemplo de archivo students.csv:

first_name,last_name,date_of_birth,grade
John,Doe,2001-05-15,85.5
Jane,Smith,2000-12-22,90.0
Alice,Johnson,2002-03-10,78.0
Bob,Brown,2001-08-30,NULL

Ojo: el orden de las columnas en el CSV debe coincidir con las columnas de la tabla, y los tipos de datos deben ser los mismos (por ejemplo, la fecha debe estar en formato YYYY-MM-DD).

Paso 3: Cargar los datos

Para cargar el archivo students.csv en la tabla students usa este comando:

COPY students (first_name, last_name, date_of_birth, grade)
FROM '/path/to/your/students.csv'
DELIMITER ',' 
CSV HEADER;

¿Qué pasa aquí?

  • Indicamos el nombre de la tabla students y las columnas donde se cargan los datos.
  • La ruta del archivo indica dónde está el archivo.
  • El separador , indica que los datos están separados por comas.
  • El parámetro CSV HEADER le dice a PostgreSQL que la primera línea del archivo tiene los nombres de las columnas.

Resultado:

Después de ejecutar el comando, los datos del archivo se cargan en la tabla y puedes comprobarlos al instante:

SELECT * FROM students;

Limitaciones y detalles

Para evitar errores, asegúrate de que tu archivo CSV cumple con estos requisitos:

  1. No hay caracteres ocultos ni espacios en la línea de cabecera.
  2. Usa la codificación correcta: en PostgreSQL normalmente se recomienda UTF-8.
  3. El separador coincide con el parámetro DELIMITER que indicaste.

Errores típicos al cargar con COPY:

Estructura de datos no coincide. Por ejemplo, si intentas cargar un valor de texto en un campo numérico:

ERROR: invalid input syntax for type numeric: "abc"

Para evitar estos problemas, asegúrate de que los datos tienen el tipo esperado.

Error de ruta del archivo.

Si el archivo está fuera del directorio accesible para PostgreSQL en el servidor, verás este error:

ERROR: could not open file "/path/to/your/file.csv" for reading: Permission denied

La solución puede ser configurar bien los permisos de acceso al archivo.

¿Cómo comprobar que los datos se cargaron bien?

Después de cargar los datos, es útil asegurarse de que todo fue bien. Por ejemplo:

Comprobar el número total de filas:

SELECT COUNT(*) FROM students;

Buscar valores vacíos (por ejemplo, si el campo grade tiene NULL):

SELECT * FROM students WHERE grade IS NULL;

Consejos útiles para trabajar con COPY

Loguea los errores. Si quieres guardar los errores en un archivo aparte, usa el parámetro LOG ERRORS. (En PostgreSQL versión 12+).

Desactiva los índices y triggers.

Al cargar grandes volúmenes de datos, puedes desactivar temporalmente los triggers:

ALTER TABLE students DISABLE TRIGGER ALL;

Usa transacciones.

Esto te permite cargar los datos "atómicamente" — o se cargan todos, o se hace rollback si hay error:

BEGIN;
COPY students FROM '/path/to/your/file.csv' CSV HEADER;
COMMIT;

Aplicación práctica

Saber usar el comando COPY no solo es útil para los admins de bases de datos — a los devs también les puede salvar la vida. Imagina que recibes un montón de datos de una API externa: primero los guardas en un CSV, luego los cargas rapidísimo en PostgreSQL — y ya puedes empezar a analizarlos. O, por ejemplo, tus colegas te piden migrar su vieja base a un sistema nuevo en PostgreSQL. En estas situaciones, COPY es tu varita mágica.

Los archivos CSV aparecen todo el rato en proyectos reales. Por ejemplo:

  • Cargas estadísticas de ventas en un sistema analítico.
  • Importas una lista de usuarios desde un CRM externo.
  • Migras datos de Excel a PostgreSQL sin dramas ni rituales raros.

Con esto terminamos la introducción al comando COPY. En la próxima lección hablaremos de cómo preparar las tablas para cargar datos y pensar su estructura para que todo vaya rápido y seguro. Por ahora, no tengas miedo de experimentar — COPY te abre posibilidades muy cómodas para trabajar con grandes volúmenes de información.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION