Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

679
Vistas
¿Puedo hacer que postgres genere automáticamente identificadores para pares de objetos usando typeorm?

Fondo

Nuestra aplicación de nodo utiliza una base de datos de postgres e interactúa con ella a través de TypeORM .

Sé cómo crear una tabla con una clave principal generada por una secuencia de postgres como se describe aquí :

 import {Entity, PrimaryGeneratedColumn} from "typeorm"; @Entity() export class User { @PrimaryGeneratedColumn() id: number; }

Meta

Estoy tratando de crear una tabla para objetos que siempre se crean en pares; llamemos a los objetos "zapatos" y digamos que los dos miembros del par son el zapato izquierdo y el zapato derecho. Me gustaría que los zapatos izquierdo y derecho fueran entradas separadas en mi tabla, y quiero poder consultar fácilmente ambos zapatos en un par.

Un enfoque sería algo como esto, que me da un índice en pairId y aplica solo un zapato izquierdo y un zapato derecho para cada par ( documentos de índice TypeORM )

 enum Foot { Left = "Left", Right = "Right" } @Entity() @Index(["foot", "pairId"], { unique: true }) export class Shoe { @PrimaryGeneratedColumn() id: number; @Column({ type: "enum", enum: Foot }) foot: Foot; @Column pairId: number }

Sin embargo, con este enfoque sigo siendo responsable de generar los valores en el campo pairId .

Pregunta

¿Hay alguna manera de que postgres genere los valores en pairId para mí? ¿Quizás usando el mismo tipo de secuencia que genera automáticamente el decorador @PrimaryGeneratedColumn ?

Actualizar

La respuesta a continuación propone una posible solución en postgres, aunque todavía necesitaría saber cómo hacer esto usando la API de TypeORM o haciendo que TypeORM ejecute los comandos SQL sin formato relevantes en el momento adecuado.

Podría escribir una migración de TypeORM para ejecutar SQL sin procesar, pero no estoy seguro de cómo hacer que se ejecute en la creación de tablas; parece que la documentación anticipa principalmente ejecutarlos desde la línea de comando.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Sí, puede asignar una secuencia a la columna en Postgres. Primer uso:

https://www.postgresql.org/docs/12/sql-createsequence.html

CREATE SEQUENCE my_seq OWNED BY shoes.pair_id

OWNED BY es opcional, pero 'vincula' la secuencia a la tabla, por lo que se descarta automáticamente con la tabla.

Luego puede hacer que la secuencia sea la PREDETERMINADA para la columna:

 test(5432)=# create table shoes (pair_id integer DEFAULT nextval('my_seq')); CREATE TABLE test(5432)=# \d shoes Table "public.shoes" Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+----------------------------- pair_id | integer | | | nextval('my_seq'::regclass)

O para la tabla existente:

 test(5432)=# create table shoes (pair_id integer); CREATE TABLE test(5432)=# alter table shoes alter COLUMN pair_id SET DEFAULT nextval('my_seq'); ALTER TABLE

Sin embargo, no tengo idea de cómo harías eso en TypeORM.

over 4 years ago · Santiago Trujillo Denunciar

0

No tengo la menor idea de TypeORM, pero es SQL directo, solo crea una tabla con una clave compuesta, una identificación generada y un valor izquierdo/derecho. Luego puede insertar ambos a través de una sola declaración.

 create table shoes (pair_id integer generated by default as identity ,foot text ,constraint shoes_pk primary key (pair_id, foot) ,constraint foot_check check (lower (foot) = any('{left, right}') ) ); with this_pair(id) as ( insert into shoes(foot) values ('left') returning pair_id ) insert into shoes(pair_id,foot) select id,'right' from this_pair returning pair_id ; select * from shoes;
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda