Añadiendo una columna y actualizando todos los registros usando knex y postgres.
Necesito agregar una columna a mi tabla de corredores, permitiéndonos almacenar el nombre de la imagen que se mostrará en la tarjeta de ese corredor. Luego necesito actualizar todos los registros con los nombres de imagen generados automáticamente.
He realizado varias búsquedas y todos los caminos parecen llevar de regreso a este hilo o a este otro. He intentado el código de ambos hilos, intercambiando los nombres de mi propia tabla y columna, pero aún no puedo hacer que funcione.
Esta es la última versión del código:
export async function up(knex, Promise) {
return knex.transaction(trx => {
const riders = [
{
name: 'Fabio Quartararo',
card: 'rider_card_FabioQuartararo'
},
...24 otros corredores aquí...
{
name: 'Garrett Gerloff',
card: 'rider_card_GarrettGerloff'
},
];
return knex.schema.table('riders', (table) => table.string('card')).transacting(trx)
.then(() =>{
const queries = [];
riders.forEach(rider => {
const query = knex('riders')
.update({
card: rider.card
})
.where('name', rider.name)
.transacting(trx); // Esto hace que cada actualización esté en la misma transacción
queries.push(query);
});
Promise.all(queries) // Una vez que se haya escrito cada consulta
.then(() => trx.commit) // Intentamos ejecutar todas las consultas
.catch(() => trx.rollback); // Y hacemos rollback en caso de algún error
});
}
Cuando ejecuto la migración, sin embargo, falla con el siguiente error:
migration file "20211202225332_update_rider_card_imgs.js" failed
migration failed with error: Cannot read properties of undefined (reading 'all')
Error running migrations: TypeError: Cannot read properties of undefined (reading 'all')
at D:\Users\seona\Documents\_Blowfish\repos\MotoGP\dist\database\migrations\20211202225332_update_rider_card_imgs.js:134:25
at processTicksAndRejections (node:internal/process/task_queues:96:5)
Entonces, claramente tiene algún tipo de problema con Promise.all()
, pero no puedo entenderlo. Buscar no me ha dado resultados útiles.
¿Alguien tiene alguna idea sobre cómo puedo hacer que esto funcione? Gracias de antemano.
davy.ai
Para agregar una columna a una tabla en postgresql, podemos usar el comando SQL
ALTER TABLE
. En este caso, el comando sería:Esto agregará una nueva columna llamada
card_img_name
a la tablariders
con un tipo de datostext
. Ahora podemos actualizar todos los registros con sus nombres de imagen generados automáticamente usando el siguiente código de migración de knex.js:Este código de migración primero define un array de objetos, donde cada objeto representa un corredor y su nombre de imagen de tarjeta asociado. Luego usa un bucle
for
para iterar sobre cada corredor y actualizar su registro en la tablariders
con elcard_img_name
correspondiente. El método.where()
asegura que estamos actualizando el registro para el corredor correcto.Al ejecutar este código de migración, asegúrese de haber generado los nombres de imagen de tarjeta para cada corredor y de que estén almacenados en el array
riders
. Además, asegúrese de que los archivos de imagen reales existan y estén ubicados en el directorio correcto.