Node.js 我可以让postgres使用TypeForm为成对的对象自动生成ID吗? 背景

Node.js 我可以让postgres使用TypeForm为成对的对象自动生成ID吗? 背景,node.js,postgresql,typeorm,Node.js,Postgresql,Typeorm,我们的节点应用程序使用postgres数据库,并通过与之交互 我知道如何使用postgres序列生成的主键创建表,如下所示: 从“typeorm”导入{Entity,PrimaryGeneratedColumn}; @实体() 导出类用户{ @PrimaryGeneratedColumn() id:编号; } 目标 我试图为总是成对创建的对象创建一个表;让我们将这些对象称为“鞋”,并假设这对对象中的两个成员是左鞋和右鞋。我希望左鞋和右鞋在我的表中是单独的条目,并且我希望能够轻松地查询成对的两种

我们的节点应用程序使用postgres数据库,并通过与之交互

我知道如何使用postgres序列生成的主键创建表,如下所示:

从“typeorm”导入{Entity,PrimaryGeneratedColumn};
@实体()
导出类用户{
@PrimaryGeneratedColumn()
id:编号;
}
目标 我试图为总是成对创建的对象创建一个表;让我们将这些对象称为“鞋”,并假设这对对象中的两个成员是左鞋和右鞋。我希望左鞋和右鞋在我的表中是单独的条目,并且我希望能够轻松地查询成对的两种鞋

一种方法是这样的,它给了我一个关于
pairId
的索引,并且每对鞋只强制一个左鞋和一个右鞋()

enum Foot{
Left=“Left”,
Right=“Right”
}
@实体()
@索引([“foot”,“pairId”],{unique:true})
出口级鞋{
@PrimaryGeneratedColumn()
id:编号;
@列({type:“enum”,enum:Foot})
脚:脚;
@纵队
佩丽德:号码
}
但是,这种方法我仍然负责在
pairId
字段中生成值

问题: 有没有办法让postgres为我生成
pairId
中的值?可能使用了由
@PrimaryGeneratedColumn
装饰器自动生成的相同类型的序列

更新 在postgres中提出了一个可能的解决方案,尽管我仍然需要知道如何使用TypeORM的API或让TypeORM在正确的时间运行相关的原始SQL命令


我可以编写一个TypeForm来运行原始SQL,但我不确定如何让它在表创建时运行——似乎文档主要预期从命令行运行它们。

是的,您可以在Postgres中为列分配一个序列。首次使用:

创建鞋拥有的序列my\u seq.pair\u id

属于的
是可选的,但是将序列与表“绑定”在一起,因此它会随表一起自动删除

然后,可以将序列设置为列的默认值:

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)

或对于现有表格:

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

我不知道在TypeORM中如何实现这一点。

我对TypeORM没有任何模糊的概念,但是直接SQL只是用一个复合键、一个生成的id和左/右值创建一个表。然后可以通过一条语句插入这两条语句

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;   

谢谢这让我们至少有了一部分了解:-)希望一些TypeORM专家知道如何在TypeORM中做到这一点(或者至少让TypeORM在正确的时间执行这些SQL命令。