PHP - Actualizar tabla a partir de resultados de una tabla de otra BBDD

 
Vista:
Imágen de perfil de Nacho
Val: 19
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Nacho (13 intervenciones) el 22/03/2021 12:23:57
Hola

Tal y como dice el enunciado, quería saber cómo actualizar una tabla "A" de una base de datos "BD1", a partir del contenido de una tabla "B" de otra base de datos "BD2", usando PDO.

¿Alguien tiene algún ejemplo gráfico?

Gracias y Salu2
Nacho
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 2.722
Plata
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Mauro (870 intervenciones) el 22/03/2021 14:37:08
Hola Nacho:

Si tienes las dos bases de datos en el mismo servidor y los permisos de acceso a ambas es bastante simple, puedes hacerlo con un sólo SQL:

1
UPDATE bd1.a SET campo = (SELECT campo FROM bd2.b);

¿Algo así serviría?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Nacho
Val: 19
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Nacho (13 intervenciones) el 22/03/2021 15:13:07
Muchas gracias Mauro, pero está en servidores diferentes.

Yo había pensado en primer lugar obtener los registros de la base de datos BD1. Posteriormente hacer un insert de todos los registros de la tabla A de BD1 en la tabla B de BD2, que no existan en dicha tabla. Posteriormente hacer un update de los datos.
Pero no encuentro ejemplos de cómo hacer la subconsulta con el objeto obtenido de PDO.

Sería algo así como ...

INSERT INTO bd2 SET campo1 = campo1DelObjetoPDO, campo2 = campo2DelObjetoPDO ... WHERE campoIdDelObjetoPDO NOT IN (SELECT campoIdDeBd2 FROM bd2)

UPDATE bd2 INNER JOIN ObjetoPDO ON campoIdDeBd2 = campoIdDelObjetoPDO SET campo1 = campo1DelObjetoPDO, campo2 = campo2DelObjetoPDO

Teniendo en cuenta que la primera consulta volcada en el objeto PDO, puede tener decenas de miles de registros.
(No sé si me explico)

La cuestión es la siguiente:

BD1 es una base de datos a la que sólo puedo acceder a leer y está ubicada en el servidor A.
BD2 es una réplica que me he creado yo, para poder grabar y actualizar los datos, incluyendo la adición de campos nuevos y está ubicada en el servidor B.

Todo el follón es por ese motivo.

Gracias y Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.722
Plata
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Mauro (870 intervenciones) el 24/03/2021 14:19:26
Hola Nacho:

Si quieres tener en las dos bases la misma información probablemente lo más conveniente sería manejarlo a nivel de infraestructura, creando la BD2 como una réplica de la BD1 y que sea el propio servidor de bases de datos el que se encargue de mantener todo sincronizado.

Si lo tienes que hacer desde php sí o sí.

En el caso de tu código

1
INSERT INTO bd2 SET campo1 = campo1DelObjetoPDO, campo2 = campo2DelObjetoPDO ... WHERE campoIdDelObjetoPDO NOT IN (SELECT campoIdDeBd2 FROM bd2)

Probablemente necesitarías hacer un ciclo sobre todos los objetos que levantes de la primera bd y, por cada uno hacer el insert.

Podrías usar una sentencia preparada para no hacerlo tan pesado...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Nacho
Val: 19
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Nacho (13 intervenciones) el 24/03/2021 14:35:29
Gracias por tu respuesta Mauro.

Desafortunadamente tengo que recurrir a este método porque no tengo acceso alguno a la BBDD original, sólo a una secundaria en donde me permiten acceder a una copia de sólo algunas tablas. En pleno siglo XXI aún no entiendo esa mentalidad de prohibir todo.

Soy nuevo en PHP y no sé muy bien cómo montar ese tipo de consulta con PDO, habiendo BBDD con conexiones distintas y acceso a objetos sobre los que hacer la consulta.

Intentaré investigar sobre su sugerencia a ver qué consigo.

Muchas gracias por tu ayuda una vez más.
Nacho
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nacho
Val: 19
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Nacho (13 intervenciones) el 25/03/2021 09:27:50
Hola Mauro

¿Cómo se asigna un alias a una base de datos con PDO?
Me explico...
En una consulta tipo:
SELECT a.id, a.descripcion, b.precio FROM articulos a INNER JOIN tarifas b ON a.id = b.id ORDER BY a.id
... se asignan alias a las tablas, pero ¿cómo se asignan alias a las BBDD?
No encuentro la forma de abrir las dos conexiones con PDO y luego crear una consulta donde lea de una BBDD para insertar valores en la otra.

Gracias y Salu2
Nacho
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nacho
Val: 19
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Nacho (13 intervenciones) el 25/03/2021 10:10:51
Aclarando sobre mi mensaje anterior:

1
2
3
4
5
6
7
8
9
10
11
$host='pgsql:host=192.168.10.110;port=8432;dbname=almacen';
$user='usuario1';
$pass='contraseña1';
 
$connDb=new pdoAdmin($host,$user,$pass);
 
$hostL='pgsql:host=192.168.10.120;port=8432;dbname=almacen';
$userL='usuario2';
$passL='contraseña2';
 
$connDbL=new pdoAdmin($hostL,$userL,$passL);

Con esto abro las dos conexiones, pero una vez aquí, ¿cómo en una misma consulta puedo hacer referencia a las dos bases de datos?

Esto por ejemplo no existe en PDO:

1
2
$host='pgsql:host=192.168.10.110;port=8432;dbname=almacen alias db1';
$hostL='pgsql:host=192.168.10.120;port=8432;dbname=almacen alias db2';

¿Se puede solucionar de alguna forma? ¿O soy especialista en encontrar imposibles?

Gracias y Salu2
Nacho
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.722
Plata
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Mauro (870 intervenciones) el 25/03/2021 12:54:08
Hola Nacho:

Voy a intentar ponerte un ejemplo de cómo yo lo resolvería. Asumiré que DbL es la db de sólo lectura y que la clase pdoAdmin extiende a PDO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
$host='pgsql:host=192.168.10.110;port=8432;dbname=almacen';
$user='usuario1';
$pass='contraseña1';
 
$connDb=new pdoAdmin($host,$user,$pass);
 
$hostL='pgsql:host=192.168.10.120;port=8432;dbname=almacen';
$userL='usuario2';
$passL='contraseña2';
 
$connDbL=new pdoAdmin($hostL,$userL,$passL);
 
$readSQL = "SELECT a.id, a.descripcion, b.precio FROM articulos a INNER JOIN tarifas b ON a.id = b.id ORDER BY a.id";
$insertSQL = "INSERT INTO articulos VALUES (:descripcion, :precio)";
 
$st = $connDb->prepare($insertSQL);
 
foreach ($connDbL->query($readSQL) as $row) {
    $st->execute([
        'descripcion' => $row['descripcion'],
        'precio' => $row['precio'],
    ]);
}

Prueba con esto. Es posible que se tome mucho tiempo si son muchos registros pero creo que será el modo más eficiente de resolverlo usando PHP.

Obviamente le falta el manejo de errores pero creo que la idea se entiende, si no es así consúltame sin problema :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Nacho
Val: 19
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Nacho (13 intervenciones) el 30/03/2021 12:21:05
Gracias Mauro una vez más por tu valiosa ayuda.

Finalmente he optado por crearme en la BBDD de escritura dos esquemas.
Sobre el primero restauro el dump del esquema de la BBDD de lectura, y luego actualizo los cambios sobre el segundo esquema.
Ahorro consultas y es mucho más práctico.

Salu2
Nacho
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.722
Plata
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Actualizar tabla a partir de resultados de una tabla de otra BBDD

Publicado por Mauro (870 intervenciones) el 30/03/2021 14:49:43
Excelente!

Muchas veces la mejor solución es evitar el problema :)

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar