TypeORM:如何使用 UUID 获取下一项?
TypeORM : How to get next item using UUID?
在订单 class 中我们有一个 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 是基于时间的,可以用作索引吗?
我发现 @PrimaryGeneratedColumn("uuid")
使用完全随机的 UUID v4
而 v1
是基于时间的 here,所以没有机会在UUID v4
的基数。
@Generated("increment")
装饰器是 the doc 中提到的另一种选择
但我犯了错误,看起来 Postgres 要求 "increment"
作为主键。
所以我更喜欢使用 createdAt(of type Date)column 进行排序,并使用 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" = ()
);
EXECUTE findNextId('cb5c5bf0-f781-46e1-9ae1-68c875bb3a56');
任何更好的解决方案将不胜感激!
我偶然发现了同样的问题。我正在使用 postgres,我想使用 UUID 作为我的主键,但我希望它们不是完全随机的。
除了实际方面,我发现 this post 提到了完全随机的 UUID 密钥如何影响数据库存储。
为了让 TypeORM 使用 uuid_generate_v1mc 而不是 UUID v4 生成 PK,我在迁移中添加了 default: '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
这使得 table 创作看起来像这样:
CREATE TABLE "tags" (
"id" uuid NOT NULL DEFAULT uuid_generate_v1mc(),
-- rest of my table definition
在订单 class 中我们有一个 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 是基于时间的,可以用作索引吗?
我发现 @PrimaryGeneratedColumn("uuid")
使用完全随机的 UUID v4
而 v1
是基于时间的 here,所以没有机会在UUID v4
的基数。
@Generated("increment")
装饰器是 the doc 中提到的另一种选择
但我犯了错误,看起来 Postgres 要求 "increment"
作为主键。
所以我更喜欢使用 createdAt(of type Date)column 进行排序,并使用 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" = ()
);
EXECUTE findNextId('cb5c5bf0-f781-46e1-9ae1-68c875bb3a56');
任何更好的解决方案将不胜感激!
我偶然发现了同样的问题。我正在使用 postgres,我想使用 UUID 作为我的主键,但我希望它们不是完全随机的。
除了实际方面,我发现 this post 提到了完全随机的 UUID 密钥如何影响数据库存储。
为了让 TypeORM 使用 uuid_generate_v1mc 而不是 UUID v4 生成 PK,我在迁移中添加了 default: '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
这使得 table 创作看起来像这样:
CREATE TABLE "tags" (
"id" uuid NOT NULL DEFAULT uuid_generate_v1mc(),
-- rest of my table definition