当前位置: 首页 > 知识库问答 >
问题:

TypeORM:如何使用UUID获取下一个项目?

燕嘉熙
2023-03-14

在订单类中,我们有UUID和其他字段:

export class Order extends BaseEntity {
    @Field()
    @PrimaryGeneratedColumn("uuid")
    id: string;

    // other fields ...

}

解析器可以是这样的:

 @Query(() => Order)
    async getNextOrder(
        @Arg("data")
        { orderId }: GetNextOrderInput,
    ) {
        return await Order.findOne(id:MoreThan(orderId);
    }

我知道它不起作用,那么如何实现下一个项目呢?UUID 是否基于时间并且可以用作索引

共有2个答案

花健
2023-03-14

我偶然发现了同样的问题。我正在使用 postgres,我想使用 UUID 作为我的主键,但我希望它们不是完全随机的。

除了实用方面,我发现这篇文章提到了完全随机的UUID密钥会如何影响数据库存储。

为了让TypeORM使用uuid_generate_v1mc而不是UUIDv4生成PK,我在我的迁移中添加了默认值:'uuid_generate_v1mc()'

await queryRunner.createTable(
  new Table({
    name: 'tags',
    columns: [
      {
        name: 'id',
        type: 'uuid',
        isPrimary: true,
        isGenerated: true,
        generationStrategy: 'uuid',
        default: 'uuid_generate_v1mc()',
      }
    ],
    // the rest of my table definition

这使得表的创建如下所示:

CREATE TABLE "tags" (
  "id" uuid NOT NULL DEFAULT uuid_generate_v1mc(),
  -- rest of my table definition
刘嘉木
2023-03-14

正如我发现的那样,@PrimaryGeneratedColumn(“uuid”)使用完全随机的 UUID v4,而 v1 是基于时间的,如此处所述,因此没有机会在 UUID v4 的基础上排序。@Generated(“增量”)装饰器是文档中提到的另一种选择,但我犯了错误,看起来 Postgres 需要“增量”作为主键。所以我更喜欢使用 createdAt(类型为日期)列进行排序和 LEAD 来获取下一个订单的 ID:

PREPARE findNextId(uuid) AS(
    WITH producedNextIds AS(
         WITH ordersOfStore AS (
        SELECT
             "order"."id", "order"."createdAt"
         From
             "order"
         INNER JOIN "site" ON "order"."storeId" = "site"."id"
        )
        SELECT "id" , "createdAt",
            LEAD("id",1) OVER (
                ORDER BY "createdAt"
                ) next_id
        FROM
            ordersOfStore
    )
        SELECT
            "id" , "createdAt", next_id
        FROM producedNextIds
        WHERE
            "id" = ($1)
);
EXECUTE findNextId('cb5c5bf0-f781-46e1-9ae1-68c875bb3a56');

任何更好的解决方案都将不胜感激!

 类似资料:
  • 如何在TypeORM中使用getter和setter。 我在这里和这里都看到了问题,但没有找到答案 例如,离开我的用户实体 我使用的是类型ORM版本 0.2.7

  • 问题内容: 如何使用JavaScript获取HTML中的下一个元素? 假设我有3个s,并且在JavaScript代码中获得了对1的引用,我想获取哪个是下一个,哪个是前一个。 问题答案: 在纯JavaScript中,我的想法是,您首先必须将它们归类到一个集合中。 因此,基本上,通过selectionDiv遍历集合以查找其索引,然后显然是-1 =上一个+1 =下一个在范围内 但是请注意,正如我所说的那

  • 我创建了一个类,它有一个名为cards的面板,其布局是CardLAyout。我添加了卡片项目。在这个类中,我想通过调用layout来创建一个单独的方法,该方法将切换到下一张卡片。 } 正如你所看到的,我在卡片上添加了其他类的面板。我想做的是创建getNextCard()方法,该方法将当前活动的面板作为其参数。当我调用此功能时,它应该将当前活动的面板切换到我的CardLayout列表中的下一个面板。

  • 假设我们有一组对象,比如: 我想迭代遍历水果,并每次告诉当前、上一个和下一个水果的名称。我会这样做: 但显然它不适用于下一个和上一个项目…有什么想法吗? 请注意,我不想使用经典for循环 (对于i=0;i 非常感谢!

  • 问题内容: 假设我有ID为3、4、7、9的记录,并且我希望能够通过下一个/上一个链接导航到另一个。问题是,我不知道如何获取具有最近的较高ID的记录。 因此,当我有一个ID为4的记录时,我需要能够获取下一个现有记录,即7。查询可能看起来像 如何获取下一个/上一个记录而不获取整个结果集并手动进行迭代? 我正在使用MySQL 5。 问题答案: 下一个: 以前:

  • 问题内容: 说我有 ID的* 记录 * 我希望能够通过下一个/上一个链接导航到另一个。 问题是,我不知道 如何获取具有最近的较高ID的记录 。 因此,当我有一个 ID为ID 的记录时,我需要能够提取下一个现有记录,即为。 该查询可能看起来像 如何获取下一个/上一个记录而不获取整个结果集并手动迭代? 我正在使用MySQL 5。 问题答案: 下一个: 以前的: