Carga de Datos en base a COPY/INSERTS

From: Luis D(dot) García <ldgarc(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Carga de Datos en base a COPY/INSERTS
Date: 2008-07-30 19:16:47
Message-ID: 3de424340807301216l20778d69v80425796c0c5bcbd@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola, les escribo pues tengo una duda para la carga de unos datos pues no sé
si haya una mejor opción.

En un trabajo que estoy haciendo se desea cargar una data almacenada en
archivos de tipo CSV en tablas dentro de una BD en PostgreSQL 8.1. Para esto
hice uso del comando COPY y la carga se realizó sin problemas y de manera
automática por medio de un CRON.

Ahora, el detalle surge cuando en la data almacenada dentro de los archivos
CSV, existen datos que ya han sido cargados con anterioridad dentro de las
BDs, razón por la cual al hacer el COPY se interrumpe la transacción por
completo al encontrar al menos un error en la carga.

Lo que se me ocurrió utilizar para esto son tablas auxiliares que sean
copias de las originales, pero que no posean restricciones de claves
primarias. En estas tablas auxiliares se hace la carga de los datos de los
CSV por medio de un COPY y se extraen luego por medio del pg_dump (con la
opciones -d -a para la extracción únicamente de los datos y en base a
inserts). Luego por medio del mecanismo "sed" se cambian los nombres de las
tablas en el archivo resultante del dump, de manera que los INSERTs se hagan
en las tablas originales.

Ahora, existe una manera más efectiva de llevar a cabo este procedimiento?

Agradezco de antemano cualquier ayuda que me puedan dar al respecto y dejo a
continuación los scripts .SH y .SQL creados para la carga de los datos...

Archivo carga.sh

#!/bin/sh

#Cambiar permisos para los archivos .CSV para hacer posible la lectura
chmod 777 /home/usuario/cargabd/cumples.csv
chmod 777 /home/usuario/cargabd/cp_recibos.csv
chmod 777 /home/usuario/cargabd/datos_recibos.csv
chmod 777 /home/usuario/cargabd/ubicacion_recibos.csv

#Script para la carga de datos en las tablas auxiliares
/usr/lib/postgresql/8.1/bin/psql -d intranet -U postgres -h localhost -f
/home/usuario/cargabd/carga.sql

#Vaciar archivos .CSV
> /home/usuario/cargabd/cumples.csv
> /home/usuario/cargabd/cp_recibos.csv
> /home/usuario/cargabd/datos_recibos.csv
> /home/usuario/cargabd/ubicacion_recibos.csv

#Hacer dump con INSERTS de las tablas auxiliares

#datos_recibos
/usr/lib/postgresql/8.1/bin/pg_dump -a -d -t aux_datos_recibos -h localhost
-U postgres intranet > /home/usuario/cargabd/dump.sql
sed -e 's/aux_datos_recibos/datos_recibos/g' /home/usuario/cargabd/dump.sql
>> /home/usuario/cargabd/datos_recibos.sql
rm /home/usuario/cargabd/dump.sql

#ubicacion_recibo
/usr/lib/postgresql/8.1/bin/pg_dump -a -d -t aux_ubicacion_recibo -h
localhost -U postgres intranet > /home/usuario/cargabd/dump.sql
sed -e 's/aux_ubicacion_recibo/ubicacion_recibo/g'
/home/usuario/cargabd/dump.sql >>
/home/usuario/cargabd/ubicacion_recibos.sql
rm /home/usuario/cargabd/dump.sql

#recibos_conceptos_pagar
/usr/lib/postgresql/8.1/bin/pg_dump -a -d -t aux_recibos_conceptos_pagar -h
localhost -U postgres intranet > /home/usuario/cargabd/dump.sql
sed -e 's/aux_recibos_conceptos_pagar/recibos_conceptos_pagar/g'
/home/usuario/cargabd/dump.sql >>
/home/usuario/cargabd/recibos_conceptos_pagar.sql
rm /home/usuario/cargabd/dump.sql

#cumples
/usr/lib/postgresql/8.1/bin/pg_dump -a -d -t aux_cumples -h localhost -U
postgres intranet > /home/usuario/cargabd/dump.sql
sed -e 's/aux_cumples/cumples/g' /home/usuario/cargabd/dump.sql >>
/home/usuario/cargabd/cumples.sql
rm /home/usuario/cargabd/dump.sql

#Cargar datos en las tablas originales

/usr/lib/postgresql/8.1/bin/psql -d intranet -U postgres -h localhost -f
/home/usuario/cargabd/datos_recibos.sql
/usr/lib/postgresql/8.1/bin/psql -d intranet -U postgres -h localhost -f
/home/usuario/cargabd/ubicacion_recibos.sql
/usr/lib/postgresql/8.1/bin/psql -d intranet -U postgres -h localhost -f
/home/usuario/cargabd/recibos_conceptos_pagar.sql
/usr/lib/postgresql/8.1/bin/psql -d intranet -U postgres -h localhost -f
/home/usuario/cargabd/cumples.sql

#Eliminar datos de las tablas auxiliares
/usr/lib/postgresql/8.1/bin/psql -d intranet -U postgres -h localhost -f
/home/usuario/cargabd/delete.sql

#Eliminar archivos .SQL
rm /home/usuario/cargabd/cumples.sql
rm /home/usuario/cargabd/recibos_conceptos_pagar.sql
rm /home/usuario/cargabd/datos_recibos.sql
rm /home/usuario/cargabd/ubicacion_recibos.sql

Archivo carga.sql

-- Se establece el encoding para la lectura de los CSV
SET client_encoding to 'LATIN1';

-- Se copian los datos
COPY aux_cumples (ci,dia,mes,nombres,direccion) from
'/home/usuario/cargabd/cumples.csv' with CSV;
COPY aux_datos_recibos from '/home/usuario/cargabd/datos_recibos.csv' with
CSV;
COPY aux_ubicacion_recibo from '/home/usuario/cargabd/ubicacion_recibos.csv'
with CSV;
COPY aux_recibos_conceptos_pagar from '/home/usuario/cargabd/cp_recibos.csv'
with CSV;

-- Se eliminan los registros con mas de 6 meses
delete from recibos_conceptos_pagar where age(fecha_pago) > '6 months';
delete from ubicacion_recibo where age(fecha_pago) > '6 months';

Archivo delete.sql

delete from aux_cumples;
delete from aux_datos_recibos;
delete from aux_ubicacion_recibo;
delete from aux_recibos_conceptos_pagar;

--
Luis D. García M.

Telf: (+58) 2418662663
Cel.: (+58) 4143482018

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2008-07-30 19:25:31 Re: Carga de Datos en base a COPY/INSERTS
Previous Message Ivan Garro 2008-07-30 18:07:03 Problemas base - Error 10061