Saltar al contenido principal

Migrar ID global único

[Traducción Beta No Oficial]

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Antes de la función integrada de ID global, la herramienta de migración tenía una opción WithGlobalUniqueID que permitía a los usuarios migrar su esquema para usar identificadores globalmente únicos. Esta opción ahora está obsoleta y los usuarios deberían utilizar la función de ID global en su lugar. Los usuarios existentes pueden migrar su esquema a identificadores globalmente únicos siguiendo los pasos que se indican a continuación.

La solución anterior utilizaba una tabla llamada ent_types para almacenar información de mapeo entre un esquema de Ent y su rango de ID asociado. La nueva solución utiliza un archivo de configuración estática para almacenar este mapeo. Para migrar a la nueva función de ID global, se puede usar el comando entfix para migrar una tabla ent_types existente al nuevo archivo de configuración.

[Atención]

Ten en cuenta que la tabla 'ent_types' puede variar entre los diferentes entornos donde esté desplegada tu aplicación. Esto es especialmente cierto si utilizas migración automática en lugar de migraciones versionadas. Por favor, verifica que todas las tablas 'ent_types' en todos los despliegues sean idénticas. Si no lo son, no podrás migrar a la nueva función de ID global.

El primer paso es instalar la herramienta entfix ejecutando el siguiente comando:

go install entgo.io/ent/cmd/entfix@latest

A continuación, puedes ejecutar el comando entfix globalid para migrar tu esquema al uso de la función de ID global. El comando requiere acceso a una base de datos para leer la tabla ent_types. Puedes conectarte a tu base de datos desplegada, a una réplica de lectura o, en el caso de migraciones versionadas, a una base de datos efímera donde hayas aplicado todas tus migraciones.

entfix globalid --dialect mysql --dsn "root:pass@tcp(localhost:3306)/app" --path ./ent
IMPORTANT INFORMATION

'entfix globalid' will convert the allocated id ranges for your nodes from the
database stored 'ent_types' table to the new static configuration on the ent
schema itself.

Please note, that the 'ent_types' table might differ between different environments
where your app is deployed. This is especially true if you are using
auto-migration instead of versioned migrations.

Please check, that all 'ent_types' tables for all deployments are equal!

Only 'yes' will be accepted to approve.

Enter a value: yes

Success! Please run code generation to complete the process.

Completa la migración ejecutando una vez más la generación de código. Deberías ver un nuevo archivo internal/globalid.go en el código generado, que contiene solo una línea que comienza con const IncrementStarts, lo que indica que el proceso finalizó correctamente. El último paso es asegurarte de eliminar la opción migrate.WithGlobalUniqueID(true) de tu configuración de migración.

Opcional: Mantener la tabla ent_types

Puede ser conveniente mantener la tabla ent_types en la base de datos y no eliminarla hasta que estés seguro de que no necesitas revertir los cálculos. Puedes hacer esto utilizando un esquema compuesto de Atlas:

schema "ent" {}

table "ent_types" {
schema = schema.ent
collate = "utf8mb4_bin"
column "id" {
null = false
type = bigint
unsigned = true
auto_increment = true
}
column "type" {
null = false
type = varchar(255)
}
primary_key {
columns = [column.id]
}
index "type" {
unique = true
columns = [column.type]
}
}

IDs universales (opción de migración obsoleta)

Por defecto, las claves primarias SQL comienzan desde 1 en cada tabla; lo que significa que múltiples entidades de diferentes tipos pueden compartir el mismo ID. A diferencia de AWS Neptune, donde los IDs de nodo son UUIDs.

Esto no funciona bien si trabajas con GraphQL, que requiere que el ID de objeto sea único.

Para habilitar el soporte de IDs universales en tu proyecto, pasa la opción WithGlobalUniqueID a la migración.

:::nota Los usuarios de migraciones versionadas deben seguir la documentación al usar WithGlobalUniqueID en MySQL 5.*. :::

package main

import (
"context"
"log"

"<project>/ent"
"<project>/ent/migrate"
)

func main() {
client, err := ent.Open("mysql", "root:pass@tcp(localhost:3306)/test")
if err != nil {
log.Fatalf("failed connecting to mysql: %v", err)
}
defer client.Close()
ctx := context.Background()
// Run migration.
if err := client.Schema.Create(ctx, migrate.WithGlobalUniqueID(true)); err != nil {
log.Fatalf("failed creating schema resources: %v", err)
}
}

How does it work? ent migration allocates a 1<<32 range for the IDs of each entity (table), and store this information in a table named ent_types. For example, type A will have the range of [1,4294967296) for its IDs, and type B will have the range of [4294967296,8589934592), etc.

Ten en cuenta que si esta opción está habilitada, el número máximo de tablas posibles es 65535.