Saltar al contenido principal

Uso de tipos compuestos en el esquema de Ent

[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 →

En PostgreSQL, un tipo compuesto se estructura como una fila o registro, compuesto por nombres de campos y sus tipos de datos correspondientes. Configurar un campo de Ent como tipo compuesto te permite almacenar datos complejos y estructurados en una única columna.

Esta guía explica cómo definir un tipo de campo de esquema como tipo compuesto en tu esquema de Ent y configurar la migración del esquema para gestionar tanto los tipos compuestos como el esquema de Ent como una única unidad de migración usando Atlas.

El soporte de Atlas para tipos compuestos está disponible exclusivamente para usuarios Pro. Para usar esta función, ejecuta:

atlas login

Instalar Atlas

[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 →

Para instalar la última versión de Atlas, simplemente ejecuta uno de los siguientes comandos en tu terminal, o visita el sitio web de Atlas:

curl -sSf https://atlasgo.sh | sh

Iniciar sesión en Atlas

$ atlas login a8m
You are now connected to "a8m" on Atlas Cloud.

Esquema compuesto

El paquete ent/schema se usa principalmente para definir tipos de Ent (objetos), sus campos, relaciones y lógica. Los tipos compuestos, o cualquier otro objeto de base de datos, no tienen representación en los modelos de Ent. Un tipo compuesto se puede definir una vez y usarse múltiples veces en diferentes campos y modelos.

Para extender nuestro esquema de PostgreSQL e incluir tanto tipos compuestos personalizados como nuestros tipos de Ent, configuramos Atlas para leer el estado del esquema desde una fuente de datos de esquema compuesto. Sigue estos pasos para configurarlo en tu proyecto:

1. Crea un schema.sql que defina el tipo compuesto necesario. De igual manera, puedes configurar el tipo compuesto en el lenguaje HCL de Atlas Schema:

schema.sql
CREATE TYPE address AS (
street text,
city text
);

2. En tu esquema de Ent, define un campo que use el tipo compuesto solo en el dialecto de PostgreSQL:

ent/schema/user.go
// Fields of the User.
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("address").
GoType(&Address{}).
SchemaType(map[string]string{
dialect.Postgres: "address",
}),
}
}
nota

In case a schema with custom driver-specific types is used with other databases, Ent falls back to the default type used by the driver (e.g., "varchar").

3. Crea un archivo de configuración atlas.hcl simple con un composite_schema que incluya tanto tus tipos personalizados definidos en schema.sql como tu esquema de Ent:

atlas.hcl
data "composite_schema" "app" {
# Load first custom types first.
schema "public" {
url = "file://schema.sql"
}
# Second, load the Ent schema.
schema "public" {
url = "ent://ent/schema"
}
}

env "local" {
src = data.composite_schema.app.url
dev = "docker://postgres/15/dev?search_path=public"
}

Uso

Tras configurar nuestro esquema, podemos obtener su representación usando el comando atlas schema inspect, generar migraciones, aplicarlas a una base de datos y más. Aquí tienes algunos comandos para empezar con Atlas:

Inspeccionar el esquema

El comando atlas schema inspect se usa comúnmente para inspeccionar bases de datos. Sin embargo, también podemos usarlo para inspeccionar nuestro composite_schema e imprimir su representación SQL:

atlas schema inspect \
--env local \
--url env://src \
--format '{{ sql . }}'

El comando anterior imprime el siguiente SQL. Fíjate en que el tipo compuesto address se define en el esquema antes de su uso en el campo address:

-- Create composite type "address"
CREATE TYPE "address" AS ("street" text, "city" text);
-- Create "users" table
CREATE TABLE "users" ("id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, "address" "address" NOT NULL, PRIMARY KEY ("id"));

Generar migraciones para el esquema

Para generar una migración para el esquema, ejecuta el siguiente comando:

atlas migrate diff \
--env local

Ten en cuenta que se crea un nuevo archivo de migración con el siguiente contenido:

migrations/20240712090543.sql
-- Create composite type "address"
CREATE TYPE "address" AS ("street" text, "city" text);
-- Create "users" table
CREATE TABLE "users" ("id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, "address" "address" NOT NULL, PRIMARY KEY ("id"));

Aplicar las migraciones

Para aplicar la migración generada a una base de datos, ejecuta el siguiente comando:

atlas migrate apply \
--env local \
--url "postgres://postgres:pass@localhost:5432/database?search_path=public&sslmode=disable"
[Aplicar el esquema directamente en la base de datos]

En ocasiones, puede ser necesario aplicar el esquema directamente a la base de datos sin generar un archivo de migración. Por ejemplo, al experimentar con cambios en el esquema, al preparar una base de datos para pruebas, etc. En estos casos, puedes usar el siguiente comando para aplicar el esquema directamente a la base de datos:

atlas schema apply \
--env local \
--url "postgres://postgres:pass@localhost:5432/database?search_path=public&sslmode=disable"

O bien, usando el SDK de Go de Atlas:

ac, err := atlasexec.NewClient(".", "atlas")
if err != nil {
log.Fatalf("failed to initialize client: %w", err)
}
// Automatically update the database with the desired schema.
// Another option, is to use 'migrate apply' or 'schema apply' manually.
if _, err := ac.SchemaApply(ctx, &atlasexec.SchemaApplyParams{
Env: "local",
URL: "postgres://postgres:pass@localhost:5432/database?search_path=public&sslmode=disable",
AutoApprove: true,
}); err != nil {
log.Fatalf("failed to apply schema changes: %w", err)
}

El código de esta guía está disponible en GitHub.