es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    ALTER TABLE riders ADD COLUMN card_img_name text;
    

    Esto agregará una nueva columna llamada card_img_name a la tabla riders con un tipo de datos text. 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:

    exports.up = async function(knex) {
      const riders = [
        {
          name: 'Fabio Quartararo',
          card_img_name: 'rider_card_FabioQuartararo.png'
        },
        // ...24 otros corredores aquí...
        {
          name: 'Garrett Gerloff',
          card_img_name: 'rider_card_GarrettGerloff.png'
        }
      ];
    
      for (const rider of riders) {
        await knex('riders')
          .where({ name: rider.name })
          .update({ card_img_name: rider.card_img_name });
      }
    };
    
    exports.down = async function(knex) {
      await knex.schema.table('riders', (table) => {
        table.dropColumn('card_img_name');
      });
    };
    

    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 tabla riders con el card_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.

Comments are closed.