Introducción a COPY

En PostgreSQL, el comando SQL COPY se utiliza para hacer duplicados de tablas, registros y otros objetos, pero también es útil para transferir datos de un formato a otro. Por ejemplo, el comando COPY puede utilizarse para insertar datos CSV en una tabla como registros de PostgreSQL. Este artículo proporcionará varios ejemplos de PostgreSQL COPY que ilustran cómo utilizar este comando como parte de la administración de su base de datos.

Declaración COPY de PostgreSQL

La declaración SQL COPY es similar a los comandos pg_dump y pg_restore que se utilizan para hacer copias de seguridad y restaurar tablas y bases de datos. Puede utilizar el comando COPY para mover archivos dentro de una tabla PostgreSQL o para poner los datos de una tabla PostgreSQL en un archivo.

Requisitos previos

Antes de empezar a ver nuestros ejemplos de COPIADO de PostgreSQL, necesitaremos revisar algunos de los requisitos previos para este tutorial:

  • Primero, necesitará tener PostgreSQL instalado y funcionando en su máquina. Si estás usando Linux, prueba el comando service postgresql status en una terminal para ver si PostgreSQL está instalado y en ejecución. A continuación, puedes utilizar CTRL + C para salir del proceso. En macOS o Linux, también puede canalizar el comando grep a través de ps para buscar cualquier proceso de PostgreSQL que se esté ejecutando actualmente:
1
ps aux | grep postgres

También puede utilizar psql -V para confirmar que la interfaz de línea de comandos psqlestá instalada y funcionando; este comando devuelve la versión de la utilidad y la información de instalación.

Debería ver una salida como la siguiente:

1
psql (PostgreSQL) 11.5

Conéctate a la interfaz de línea de comandos psql para PostgreSQL

Una vez que todos los requisitos previos están en su lugar, puedes intentar conectarte a la interfaz psql. Utiliza el sudo su - postgres en una terminal seguido de psql. El comando psql --help se puede utilizar para obtener más información sobre la conexión a una base de datos PostgreSQL con un usuario.

Crear una base de datos PostgreSQL

Este es el comando que usaremos en la interfaz psql para crear una base de datos PostgreSQL:

1
CREATE DATABASE somedb;

Ahora podemos conectarnos a nuestra base de datos mediante el comando \c para poder empezar a introducir consultas.

Crear una tabla PostgreSQL

A continuación, crearemos una tabla para utilizarla en nuestros ejemplos:

1
2
3
4
5
CREATE TABLE csv_tbl(
id SERIAL PRIMARY KEY,
nombre TEXTO,
apellido TEXTO
);

Ejemplos de copia en PostgreSQL

Llegados a este punto, estamos preparados para sumergirnos en algunos ejemplos de cómo podemos utilizar el comando SQL COPY para duplicar o transferir datos.

Copiar datos de archivos de texto en Postgres

Un formato de archivo TEXT consiste en filas formadas por columnas que están separadas por un carácter delimitador; los datos se escriben o leen entonces como un archivo de texto con una línea de una tabla por fila.

1
2
COPY TABLE_NAME (col, col2)
FROM / TO ‘filename’ DELIMITER ‘ ‘;

Podemos utilizar el comando COPY de PostgreSQL para exportar un archivo CSV a nuestra tabla de demostración con un formato de archivo TEXT:

1
2
COPY demo(firstname, lastname) TO
‘demo.txt’ DELIMITADOR ‘ ‘;

Copiar datos binarios en Postgres

Un formato de archivo BINARY se identifica como un archivo ‘no de texto’ ya que todos los datos se almacenan o leen como formato binario. Esto puede ser más rápido que el formato de texto y csv.

Intentemos usar el comando COPY para exportar un solo registro de una tabla en un archivo binario. Esta es la sintaxis básica:

1
2
3
4
5
6
COPY (
SELECT col1, col2, col3
FROM TABLE_NAME
WHERE {condition}
)
TO STDOUT WITH BINARY;

Para nuestro ejemplo, el comando quedará así:

1
2
3
4
5
COPY (
SELECT firstname, lastname
FROM demo WHERE id=50
) TO STDOUT WITH BINARY;
PGCOPY

Inserta datos CSV en PostgreSQL usando COPY

Ahora que hemos visto un par de ejemplos de exportación de datos, vamos a intentar utilizar COPY para insertar datos de filas CSV en una tabla PostgreSQL. Utilizaremos las siguientes dos filas de datos de prueba CSV para ilustrar cómo se puede utilizar COPY para insertar datos en Postgres desde un archivo CSV:

1
2
3
id, str_col, int_col, bool_col
1, «soy de un archivo CSV», 112233, true
2, «hola, Postgres», 8765, false

Terminología de CSV

Cuando hablamos de archivos CSV, hay un par de términos clave que hay que entender:

  • DELIMITER – Un delimitador es un carácter que separa cada fila del archivo en columnas; en un archivo CSV, el delimitador es una coma. Los delimitadores no se pueden utilizar en formato binario.

  • HEADER – Cuando se crea un archivo CSV, la línea de cabecera es la primera línea del archivo que contiene los nombres de las columnas.

Utilizar las palabras clave COPY y FROM para insertar datos de Postgres desde un archivo

La siguiente sentencia SQL insertará filas de datos CSV en una tabla llamada some_table:

1
2
3
COPY some_table
FROM ‘/Users/macuser/postgres-data.csv’
DELIMITER ‘,’ CSV HEADER;

NOTA: Asegúrate de pasar la ruta absoluta del archivo como una cadena en tu cláusula FROM para evitar errores.

Captura de pantalla de un ejemplo de psql PostgreSQL copy para insertar datos CSV

Utilizar COPY para recortar los espacios en blanco de los datos de la tabla PostgreSQL

Un pequeño problema con el uso de COPY para insertar datos CSV es que resultará en espacios en blanco iniciales y finales en nuestra columna de cadena. Afortunadamente, hay una solución sencilla para este problema. Intentemos insertar nuestros datos CSV de nuevo, y esta vez utilizaremos una tabla temporal para almacenar los datos. A continuación, utilizaremos la función LTRIM de SQL para eliminar los espacios en blanco de nuestra columna de cadenas antes de insertarla en nuestra tabla permanente de PostgreSQL.

NOTA: Asegúrese de truncar la tabla de prueba escribiendo TRUNCATE some_table; en psql antes de volver a insertar los datos CSV para evitar cualquier error de clave duplicada.

Crear una tabla temporal para almacenar los datos CSV

La siguiente sentencia SQL creará una tabla temporal para nuestros datos CSV:

1
2
CREATE TEMP TABLE temp_tbl AS
SELECT * FROM some_table LIMIT 0;

Este comando SQL devolverá SELECT 0 si tiene éxito.

Ahora, vamos a probar el comando COPY de nuevo, sólo que esta vez copiaremos las filas del CSV a la tabla temporal:

1
2
3
COPY temp_tbl
FROM ‘/Users/macuser/postgres-data.csv’
DELIMITER ‘,’ CSV HEADER;

La sentencia SQL mostrada arriba debería devolver COPY seguido del número de filas CSV que ha copiado.

Utilizar LTRIM() para eliminar los espacios en blanco de los datos de la tabla PostgreSQL

Nuestro siguiente ejemplo insertará los datos de la tabla temporal en la tabla permanente. Cuando ejecutamos esta sentencia INSERT, debemos especificar explícitamente la cabecera de cada columna y asegurarnos de pasar la columna string a la función LTRIM() para poder eliminar los espacios en blanco:

1
2
3
4
INSERT INTO some_table
(id, str_col, int_col, bool_col)
SELECT id, LTRIM(str_col), int_col, bool_col
FROM temp_tbl;

Después de ejecutar este INSERT comando, los registros deberían copiarse de la tabla temporal a nuestra some_table tabla PostgreSQL. Ahora usaremos la sentencia SELECT * FROM some_table para verificar que los datos del CSV fueron insertados sin los espacios en blanco iniciales y finales.

Captura de pantalla de psql usando COPY para LTRIM los espacios en blanco en los datos de cadena de PostgreSQL

El comando que se muestra a continuación sólo es necesario si necesita liberar memoria o espacio a corto plazo; de lo contrario, la tabla temporal se eliminará automáticamente cuando finalice la sesión de psql:

1
DROP TABLE temp_tbl;

Conclusión

No hay duda de que el comando SQL COPY puede utilizarse para una gran variedad de tareas de administración de bases de datos. No sólo puedes usar el comando para duplicar tablas y registros, sino que también puedes usar COPY para transferir datos de un formato a otro. En este artículo, le mostramos ejemplos de PostgreSQL COPY que ilustran cómo importar y exportar datos entre un archivo CSV y una tabla PostgreSQL. Con estos ejemplos para empezar, podrás aprovechar el poder del comando COPY en tu propia implementación de PostgreSQL.

Categorías: Articles

0 comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *