gpt4 book ai didi

node.js - 我可以让 postgres 使用 typeorm 为成对的对象自动生成 id 吗?

转载 作者:行者123 更新时间:2023-12-05 06:14:47 25 4
gpt4 key购买 nike

背景

我们的 Node 应用程序使用 postgres 数据库并通过 TypeORM 与其交互.

我知道如何使用由 postgres 序列生成的主键作为 described here 创建一个表:

import {Entity, PrimaryGeneratedColumn} from "typeorm";

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
}

目标

我正在尝试为总是成对创建的对象创建一个表;让我们称对象为“鞋子”,并说这对鞋子中的两个成员是左鞋和右鞋。我希望左鞋和右鞋在我的表中是单独的条目,并且我希望能够轻松查询一双鞋。

一种方法是这样的,它为我提供了一个关于 pairId 的索引,并且每双只强制执行一只左鞋和一只右鞋 (TypeORM index docs)

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
}

但是,这种方法我仍然负责生成pairId字段中的值。

问题

有没有办法让 postgres 为我生成 pairId 中的值?也许使用由 @PrimaryGeneratedColumn 装饰器自动生成的相同类型的序列?

更新

Response below在 postgres 中提出了一个可能的解决方案,尽管我仍然需要知道如何通过使用 TypeORM 的 API 或让 TypeORM 在正确的时间运行相关的原始 SQL 命令来做到这一点。

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

最佳答案

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

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

创建 shoes.pair_id 拥有的序列 my_seq

OWNED BY 是可选的,但会将序列“绑定(bind)”到表中,因此它会自动随表一起删除。

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

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 中做到这一点。

关于node.js - 我可以让 postgres 使用 typeorm 为成对的对象自动生成 id 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62734446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com