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.

Cucaracha aumentando extrañamente de forma automática en el id de clave primaria en el servidor pero no en local (sembrando la base de datos de Cockroach en la nube pública alojada por knex.js).

No puedo entender por qué está sucediendo esto por ningún motivo. Cada vez que ejecuto mi lógica de eliminación/creación de la tabla de migración y posterior carga de datos en la base de datos del servidor, me genera IDs de 18 dígitos en lugar de incrementar de 1 en 1 (1, 2, 3). En mi entorno local todo funciona bien, mi base de datos es una base de datos Cockroach en la capa gratuita de alojamiento. Aquí hay algunos ejemplos de IDs generados (725368665646530561, 725368665646694401, 725368665646727169).

EDIT:

Basado en un comentario y en algunas investigaciones adicionales, descubrí que Cockroach DB, aunque es compatible con Postgres, no es verdaderamente una base de datos Postgres. También me di cuenta de lo poco querido y poco eficiente que es el enfoque de AUTO_INCREMENT. Terminé usando una extensión para generar UUID como PK y luego consulto los datos recién creados y tomo esos UUID si necesito algunas relaciones FK en otra carga de datos.

t.uuid(‘id’).primary().notNullable().defaultTo(knex.raw(‘uuid_generate_v4()’));

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás enfrentando está relacionado con la forma en que CockroachDB maneja la función de autoincremento. CockroachDB es compatible con Postgres pero no totalmente, y algunas características pueden funcionar de manera diferente a lo que esperas.

    En lugar de depender de números autoincrementables, puedes utilizar UUIDs (Identificadores Únicos Universales) como claves primarias para tus tablas. Este enfoque garantiza IDs únicos sin depender de enteros autoincrementables.

    Para implementar esta solución, puedes utilizar la extensión uuid-ossp, que viene incluida por defecto en CockroachDB. Aquí tienes un ejemplo de script de migración:

    exports.up = function(knex) {
      return knex.schema.createTable('users', function(t) {
        t.uuid('id').primary().defaultTo(knex.raw('uuid_generate_v4()'));
        t.string('name').notNullable();
        t.timestamps(true, true);
      });
    };
    
    exports.down = function(knex) {
      return knex.schema.dropTable('users');
    };
    

    Este script crea una tabla users con una clave primaria de tipo UUID generada por la función uuid_generate_v4().

    Para poblar tu base de datos con UUIDs, puedes utilizar el siguiente código:

    exports.seed = function(knex) {
      return knex('users').del()
        .then(function () {
          return knex('users').insert([
            {id: knex.raw('uuid_generate_v4()'), name: 'John Doe'},
            {id: knex.raw('uuid_generate_v4()'), name: 'Jane Doe'},
            {id: knex.raw('uuid_generate_v4()'), name: 'Bob Smith'},
          ]);
        });
    };
    

    Este código elimina todos los registros existentes en la tabla users y luego inserta tres nuevos registros con claves primarias UUID generadas por la función uuid_generate_v4().

    Con este enfoque, puedes evitar los problemas con los enteros autoincrementables y asegurarte de que tus IDs sean verdaderamente únicos.

Comments are closed.