Re: La mejor manera de actualizar una tabla con datos externos.

Lists: pgsql-es-ayuda
From: Pablo Braulio <brulics(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: La mejor manera de actualizar una tabla con datos externos.
Date: 2006-01-30 12:35:49
Message-ID: 200601301335.55219.brulics@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Buenos y fríos días.

Tengo un caso de una base de datos en la cual una tabla debo actualizarla
periódicamente con datos de otra base de datos externa (no es postgres).

La cuestión es saber cual es el mejor modo de realizar esto. Puedo usar COPY
para introducir los datos, pero una vez la tabla en cuestión disponga de
datos, ¿como podría hacerlo para que no me duplique datos y no de errores?.

He mirado la documentación de COPY y no he visto ninguna opción de actualizar
o similar.
--
Saludos.
Pablo
------------
Jabber: bruli(at)myjabber(to)net
Fingerprint: 944D 10DA 4C10 08D1 574D 4B48 3BC1 CEF7 F222 EB1D


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Pablo Braulio <brulics(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: La mejor manera de actualizar una tabla con datos externos.
Date: 2006-01-30 15:51:21
Message-ID: 20060130155121.GA8170@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Pablo Braulio escribió:
> Buenos y fríos días.

Aca hace bastante calor!

> Tengo un caso de una base de datos en la cual una tabla debo actualizarla
> periódicamente con datos de otra base de datos externa (no es postgres).
>
> La cuestión es saber cual es el mejor modo de realizar esto. Puedo usar COPY
> para introducir los datos, pero una vez la tabla en cuestión disponga de
> datos, ¿como podría hacerlo para que no me duplique datos y no de errores?.

Una idea seria borrar todos los datos en la tabla de destino (TRUNCATE)
y hacer el COPY a la tabla completa. La otra seria ver si hay alguna
manera de ver en el "maestro" cuales son los registros que se insertaron
despues de la ultima vez que "replicaste"; una manera de hacerlo es
tener un booleano en cada registro, valor inicial falso, y cuando se
replique cada valor ponerlo en verdadero. Solo replicar aquellos con
falso.

> He mirado la documentación de COPY y no he visto ninguna opción de actualizar
> o similar.

No existe.

--
Alvaro Herrera http://www.amazon.com/gp/registry/DXLWNGRJD34J
"El hombre nunca sabe de lo que es capaz hasta que lo intenta" (C. Dickens)


From: Pablo Braulio <brulics(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: La mejor manera de actualizar una tabla con datos externos.
Date: 2006-01-30 16:02:48
Message-ID: 200601301702.51922.brulics@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

El Lunes, 30 de Enero de 2006 16:51, Alvaro Herrera escribió:
> Pablo Braulio escribió:
> > Buenos y fríos días.
>
> Aca hace bastante calor!
>
Es verdad, no había caído.

> Una idea seria borrar todos los datos en la tabla de destino (TRUNCATE)
> y hacer el COPY a la tabla completa. La otra seria ver si hay alguna
> manera de ver en el "maestro" cuales son los registros que se insertaron
> despues de la ultima vez que "replicaste"; una manera de hacerlo es
> tener un booleano en cada registro, valor inicial falso, y cuando se
> replique cada valor ponerlo en verdadero. Solo replicar aquellos con
> falso.

Me quedo con esto último que has dicho. Pero, ¿te refieres a introducir un
valor verdadero en el campo booleano con una función tras la inserción? y
¿como se podría hacer la comprobación en el copy?

--
Saludos.
Pablo
------------
Jabber: bruli(at)myjabber(to)net
Fingerprint: 944D 10DA 4C10 08D1 574D 4B48 3BC1 CEF7 F222 EB1D


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Pablo Braulio <brulics(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: La mejor manera de actualizar una tabla con datos externos.
Date: 2006-01-30 16:58:16
Message-ID: 20060130165816.GA8916@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Pablo Braulio escribió:

> > Una idea seria borrar todos los datos en la tabla de destino (TRUNCATE)
> > y hacer el COPY a la tabla completa. La otra seria ver si hay alguna
> > manera de ver en el "maestro" cuales son los registros que se insertaron
> > despues de la ultima vez que "replicaste"; una manera de hacerlo es
> > tener un booleano en cada registro, valor inicial falso, y cuando se
> > replique cada valor ponerlo en verdadero. Solo replicar aquellos con
> > falso.
>
> Me quedo con esto último que has dicho. Pero, ¿te refieres a introducir un
> valor verdadero en el campo booleano con una función tras la inserción? y
> ¿como se podría hacer la comprobación en el copy?

Hum, cual comprobacion? Simplemente inicia una transaccion en modo
serializable, vuelca los datos de la tabla que esten en falso, luego haz
un UPDATE que cambie todo a "verdadero". Como esta en modo
serializable, los datos que se hayan insertado mientras estabas en
proceso no deberian ser tocados, y los datos que se hayan volcado con
anterioridad no deberian volcarse nuevamente, y por lo tanto por
definicion no habra ningun conflicto al momento de ejecutar el COPY.

Si eso no funciona, considera botar la otra base de datos y sustituyela
por una que soporte modo serializable.

--
Alvaro Herrera http://www.PlanetPostgreSQL.org
Dios hizo a Adán, pero fue Eva quien lo hizo hombre.


From: Pablo Braulio <brulics(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: La mejor manera de actualizar una tabla con datos externos.
Date: 2006-01-30 17:25:31
Message-ID: 200601301825.36237.brulics@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

El Lunes, 30 de Enero de 2006 17:58, Alvaro Herrera escribió:
> Hum, cual comprobacion?  Simplemente inicia una transaccion en modo
> serializable, vuelca los datos de la tabla que esten en falso, luego haz
> un UPDATE que cambie todo a "verdadero".  Como esta en modo
> serializable, los datos que se hayan insertado mientras estabas en
> proceso no deberian ser tocados, y los datos que se hayan volcado con
> anterioridad no deberian volcarse nuevamente, y por lo tanto por
> definicion no habra ningun conflicto al momento de ejecutar el COPY.
>
> Si eso no funciona, considera botar la otra base de datos y sustituyela
> por una que soporte modo serializable.

A ver si lo he entendido.

Sacamos los datos de la base de datos de origen (la que no es postgres) y lo
ponemos a un archivo csv. En la tabla destino, tenemos un campo boolean, con
false por defecto.

Hacemos el COPY e insertamos los datos en la tabla destino. Hacemos un UPDATE
y ponemos todos los registros como "true".

Mi duda viene, en si se puede comprobar el campo boolean al hacer el COPY.

Si lo que te referías, al decir que cree un campo boolean, es que lo haga en
la base de datos de origen, no creo que sea buena idea. Pues no creo que mi
cliente esté de acuerdo en que toque su base de datos, pues en la mayorïa de
casos son aplicaciones comerciales. A ser posible, prefiero no tocar lo que
no controlo.

Se me acaba de ocurrir, que podría usar una tabla temporal para volcar los
datos con COPY, y luego insertarlo en la tabla destino comparando su
contenido.

Despúes de esto se borran los datos de la tabla temporal.

¿Que opinas?.
--
Saludos.
Pablo
------------
Jabber: bruli(at)myjabber(to)net
Fingerprint: 944D 10DA 4C10 08D1 574D 4B48 3BC1 CEF7 F222 EB1D


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Pablo Braulio <brulics(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: La mejor manera de actualizar una tabla con datos externos.
Date: 2006-01-30 17:48:55
Message-ID: 20060130174855.GC9310@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Pablo Braulio escribió:

> A ver si lo he entendido.
>
> Sacamos los datos de la base de datos de origen (la que no es postgres) y lo
> ponemos a un archivo csv. En la tabla destino, tenemos un campo boolean, con
> false por defecto.

No, efectivamente me referia a que agregaras la columna en la tabla de
origen.

Si la pones en el destino:

> Mi duda viene, en si se puede comprobar el campo boolean al hacer el COPY.

Cual campo boolean? Si en el destino todos los registros que hay ya
fueron, obviamente, copiados, y como el origen no tiene la columna, no
hay ninguna manera de saber mirando el COPY si un registro esta en el
destino o no.

> Se me acaba de ocurrir, que podría usar una tabla temporal para volcar los
> datos con COPY, y luego insertarlo en la tabla destino comparando su
> contenido.

Ugh. Vas a hacer un SELECT para cada registro en el origen, y si no
existe, lo insertas o de lo contrario te lo saltas? Eso requiere muchos
mas accesos a disco.

> ¿Que opinas?.

Yo aplicaria TRUNCATE y copiaria todo de nuevo cada vez.

--
Alvaro Herrera Developer, http://www.PostgreSQL.org
"Cuando mañana llegue pelearemos segun lo que mañana exija" (Mowgli)


From: "Carlos Chavez Herrera" <cechav(at)hotmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: saludos
Date: 2006-01-30 17:52:43
Message-ID: BAY105-F7725CDC9A6463AD525963D5090@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

<html><div style='background-color:'><P>que tal comunidad, pregunta: quiero saber cuales son las tablas que pertenecen a una determinada base de datos, pero la quiero sacar por queries, por ejemplo se que para sacar las bases de datos hago un select * from pg_database; esto lo he estado leyendo en el catalogo de sistema, pero estoy tratando de sacar las tablas que pertenecen a las bases de datos, pero no ubico el campo que los relaciona, alguien sabe algo de lo que pregunto, nos vemos<BR><BR></P></div></html>

Attachment Content-Type Size
unknown_filename text/html 517 bytes

From: Pablo Braulio <brulics(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: La mejor manera de actualizar una tabla con datos externos.
Date: 2006-01-30 18:11:19
Message-ID: 200601301911.22724.brulics@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

El Lunes, 30 de Enero de 2006 18:48, Alvaro Herrera escribió:
> Yo aplicaria TRUNCATE y copiaria todo de nuevo cada vez.

Creo que lo mejor será esta opción. Si no hay mas remedio, pues lo haremos
así.

Gracias por la ayuda.
--
Saludos.
Pablo
------------
Jabber: bruli(at)myjabber(to)net
Fingerprint: 944D 10DA 4C10 08D1 574D 4B48 3BC1 CEF7 F222 EB1D


From: Jaime Casanova <systemguards(at)gmail(dot)com>
To: Carlos Chavez Herrera <cechav(at)hotmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: saludos
Date: 2006-01-30 19:29:30
Message-ID: c2d9e70e0601301129m6de68e8eq7c278ff9314bc585@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 1/30/06, Carlos Chavez Herrera <cechav(at)hotmail(dot)com> wrote:
>
>
> que tal comunidad, pregunta: quiero saber cuales son las tablas que
> pertenecen a una determinada base de datos, pero la quiero sacar por
> queries, por ejemplo se que para sacar las bases de datos hago un select *
> from pg_database; esto lo he estado leyendo en el catalogo de sistema, pero
> estoy tratando de sacar las tablas que pertenecen a las bases de datos, pero
> no ubico el campo que los relaciona, alguien sabe algo de lo que pregunto,
> nos vemos
>
>

entra al psql con la opcion -E (esa opcion hace que te muestre los
queries de los comandos que ejecutas)

y ejecuta el comando \d que te muestra todas las tablas

--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)


From: "Carlos Chavez Herrera" <cechav(at)hotmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: saludos
Date: 2006-01-30 20:24:48
Message-ID: BAY105-F29279C142598C12D1E4949D5090@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

<html><div style='background-color:'><P><BR><BR></P>
<DIV>
<P>lo que pasa es que quiero sacar las tablas de una determinada base de datos por query, me explico, si hago un select * from pg_database; esto retornara todas las bases de datos, ahora debe de existir un query que me retorne las tablas de una base de datos, por ejemplo:</P>
<P>&nbsp;select * from pg_tables where schemaname='public' and database="mi base de datos";</P>
<P>logicamente que ese campo no existe en esa tabla, pero la relacion entre bases de datos y tablas tiene que estar en algun lado ( tabla ) y eso es lo que busco</P>
<P>nos vemos<BR><BR></P><BR>
<DIV>
<H6 align=right>&nbsp;</H6></DIV>
<BLOCKQUOTE style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #a0c6e5 2px solid; MARGIN-RIGHT: 0px"><FONT style="FONT-SIZE: 11px; FONT-FAMILY: tahoma,sans-serif">
<HR color=#a0c6e5 SIZE=1>
From: <I>Jaime Casanova &lt;systemguards(at)gmail(dot)com&gt;</I><BR>To: <I>Carlos Chavez Herrera &lt;cechav(at)hotmail(dot)com&gt;</I><BR>CC: <I>pgsql-es-ayuda(at)postgresql(dot)org</I><BR>Subject: <I>Re: [pgsql-es-ayuda] saludos</I><BR>Date: <I>Mon, 30 Jan 2006 14:29:30 -0500</I><BR>&gt;On 1/30/06, Carlos Chavez Herrera &lt;cechav(at)hotmail(dot)com&gt; wrote:<BR>&gt; &gt;<BR>&gt; &gt;<BR>&gt; &gt; que tal comunidad, pregunta: quiero saber cuales son las tablas que<BR>&gt; &gt; pertenecen a una determinada base de datos, pero la quiero sacar por<BR>&gt; &gt; queries, por ejemplo se que para sacar las bases de datos hago un select *<BR>&gt; &gt; from pg_database; esto lo he estado leyendo en el catalogo de sistema, pero<BR>&gt; &gt; estoy tratando de sacar las tablas que pertenecen a las bases de datos, pero<BR>&gt; &gt; no ubico el campo que los relaciona, alguien sabe algo de lo que pregunto,<BR>&gt; &gt; nos
vemos<BR>&gt; &gt;<BR>&gt; &gt;<BR>&gt;<BR>&gt;entra al psql con la opcion -E (esa opcion hace que te muestre los<BR>&gt;queries de los comandos que ejecutas)<BR>&gt;<BR>&gt;y ejecuta el comando \d que te muestra todas las tablas<BR>&gt;<BR>&gt;<BR>&gt;--<BR>&gt;Atentamente,<BR>&gt;Jaime Casanova<BR>&gt;(DBA: DataBase Aniquilator ;)<BR>&gt;<BR>&gt;---------------------------(fin del mensaje)---------------------------<BR>&gt;TIP 8: explain analyze es tu amigo<BR></FONT></BLOCKQUOTE></DIV></div></html>

Attachment Content-Type Size
unknown_filename text/html 2.2 KB

From: Jaime Casanova <systemguards(at)gmail(dot)com>
To: Pablo Braulio <brulics(at)gmail(dot)com>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: La mejor manera de actualizar una tabla con datos externos.
Date: 2006-01-30 21:13:18
Message-ID: c2d9e70e0601301313o17a77878ne02b97176d7ab817@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 1/30/06, Pablo Braulio <brulics(at)gmail(dot)com> wrote:
> El Lunes, 30 de Enero de 2006 18:48, Alvaro Herrera escribió:
> > Yo aplicaria TRUNCATE y copiaria todo de nuevo cada vez.
>
> Creo que lo mejor será esta opción. Si no hay mas remedio, pues lo haremos
> así.
>
> Gracias por la ayuda.

pero si vas a usar TRUNCATE, no puede haber campos en otras tablas que
tengan un constraint FK apuntando a la tabla que vas a borrar...

--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)