Estoy bastante seguro de que todos nosotros hemos estado en una situación en la que necesitábamos generar un informe y/o extraer algunos datos de una base de datos y presentarlos en aspreadsheet. En muchos casos, nuestros clientes prefieren Excel para manejar hojas de cálculo/informes, porque, duh, es Excel.

Entonces, ¿cómo enfocas este problema? ¿Copias y pegas los datos? O utilizar unRDBMS GUI para generar el informe en una hoja de cálculo? Hoy, le mostraré una característica pequeña pero conveniente de PostgreSQL -COPY.

Hola COPY#

De la documentación de COPY: «COPY mueve datos entre tablas de PostgreSQL y archivos del sistema de archivos estándar. COPY TO copia el contenido de una tabla a un archivo, mientras queCOPY FROM copia datos de un archivo a una tabla (añadiendo los datos a lo que ya está en la tabla). COPY TO también puede copiar los resultados de una consulta SELECT.»

Entonces, ¿qué hace COPY:

  1. Puede copiar el contenido de un archivo (datos) a una tabla, o
  2. Puede copiar el contenido de una tabla (o el resultado de una consulta SELECT) a un archivo.

Si se especifica una lista de columnas, COPY sólo copiará los datos de las columnas especificadas hacia o desde el archivo. Si hay columnas en la tabla que no están en la lista de columnas, COPY FROM insertará los valores por defecto para esas columnas.

COPY con un nombre de archivo ordena al servidor PostgreSQL leer o escribir directamente en un archivo. El archivo debe ser accesible para el servidor y el nombre debe ser especificado desde el punto de vista del servidor. Cuando se especifica STDIN o STDOUT, los datos se transmiten a través de la conexión entre el cliente y el servidor.

¿Suena bien? Vamos a probarlo.

Descargo de responsabilidad: COPY tiene la capacidad de leer/escribir datos desde/hacia archivos CSV y binarios. Aunque estoy seguro de que hay un montón de casos de uso para el uso de archivos binarios, en este blogpost sólo se centrará en el uso de archivos CSV porque, personalmentepara mí, son los más convenientes para el manejo de conjuntos de datos.

COPY TO#

Cuando quieras crear un archivo CSV a partir de una consulta SELECT, o volcar todo el contenido de una tabla en un archivo CSV, puedes utilizar el comando «COPY … TO …».

Usando una consulta SELECT#

Cuando se quiere copiar un conjunto de resultados a un archivo CSV, el formato del comando COPY es:

1
COPY (<select-query-here>) TO <file-path>;

O, un ejemplo más real:

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv';

Como puedes ver, utilizamos el comando COPY que copia los resultados en un archivo CSV en el sistema de archivos local. Puedes llevar la consulta mucho más allá. Este es un ejemplo real de un proyecto en el que estoy trabajando actualmente:

1
COPY (SELECT price_rules.* FROM quotes LEFT JOIN price_rules ON quotes.id = price_rules.chargeable_id where quotes.id = 437) TO '~/Desktop/exports/price_rules.csv' CSV;

Como puedes ver, puedes utilizar cualquier consulta SELECT que pueda devolver un conjunto de datos. 🙂

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv' CSV HEADER;

Añadir la palabra clave HEADER al final incluirá las cabeceras en el archivo CSV, que son los nombres de las columnas de la tabla.

También, otra característica clave de los archivos CSV son los delimitadores. Dependiendo del delimitador que desee que tenga el archivo CSV, puede especificar el carácter en el comando:

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv' CSV DELIMITER ',' HEADER;

Usando un nombre de tabla#

Cuando se quiere volcar una tabla entera en un CSV, el comando es realmente más sencillo. Sólo tienes que especificar el nombre de la tabla y el archivo de destino:

1
COPY people TO '~/Desktop/people.csv' CSV DELIMITER ',' HEADER;

Eso es todo.

COPY FROM#

Ahora, cuando quiera inyectar los datos del archivo CSV en una tabla, puede utilizar el comando «COPY &mldr; FROM &mldr;». La sintaxis es muy similar, con una sola diferencia:

1
COPY <table-name> FROM <file-path> DELIMITER ',' CSV HEADER;

O, utilizando un ejemplo de la vida real:

1
COPY addresses FROM '~/Desktop/addresses.csv' DELIMITER ',' CSV HEADER;

Outro#

COPY es una característica realmente limpia y genial de Postgres. Para brewity, traté de mantener este blogpost corto y simple. Si tienes alguna idea o pregunta, no dudes en dejarme un comentario. O, si no te apetece charlar, puedes dirigirte a la documentación de COPY.

¿Te ha gustado este artículo? Suscríbase a mi boletín de noticias y reciba mis nuevas publicaciones en su bandeja de entrada. Es corto y dulce, y se envía mensualmente a más de 1.000 suscriptores.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.