乐闻世界logo
搜索文章和话题

How to auto generated UUID in PostgreSQL in TypeORM

2 个月前提问
1 个月前修改
浏览次数49

2个答案

1
2

在使用TypeORM操作PostgreSQL时,自动生成UUID非常有用,尤其是在处理需要唯一标识符的数据行时。要在TypeORM中设置自动生成UUID,您可以通过几种方式来实现。

使用数据库默认值

在PostgreSQL中,您可以利用uuid-ossp扩展,该扩展提供了生成UUID的函数。首先,确保您的PostgreSQL数据库安装了uuid-ossp模块。您可以通过运行以下SQL命令来安装:

sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

接着,在TypeORM的实体中,您可以使用@Column装饰器并指定default属性来调用uuid_generate_v4()函数,这样每次创建新记录时,都会自动生成UUID。例如:

typescript
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn('uuid') id: string; @Column({ type: 'varchar', length: 255 }) name: string; }

在上面的代码中,@PrimaryGeneratedColumn('uuid')告诉TypeORM使用UUID作为主键,并且默认使用PostgreSQL的uuid_generate_v4()函数生成新的UUID值。

使用TypeORM Decorators

如果您不想依赖于数据库的默认值或想在应用程序层面处理UUID生成,可以在TypeORM中使用BeforeInsert装饰器来在插入记录之前生成UUID。这可以通过使用JavaScript的uuid库完成,首先需要安装这个库:

bash
npm install uuid

然后,在实体中引入并使用它:

typescript
import { Entity, PrimaryColumn, Column, BeforeInsert } from 'typeorm'; import { v4 as uuidv4 } from 'uuid'; @Entity() export class User { @PrimaryColumn() id: string; @Column({ type: 'varchar', length: 255 }) name: string; @BeforeInsert() addId() { this.id = uuidv4(); } }

在这个例子中,每次插入新的User实例之前,addId函数都会被调用,将id字段设置为一个新生成的UUID。

总结

选择哪种方法取决于您对数据库与应用程序逻辑之间职责划分的偏好。使用数据库默认值(如uuid-ossp)可以更好地利用数据库的功能,而在应用层面生成UUID(如使用uuid库和@BeforeInsert)则提供了更多的灵活性和控制。在选择时,考虑应用的具体需求和预期的数据库交互方式。

2024年8月4日 16:56 回复

UUID的生成与TypeORM的使用

面试官:首先,欢迎您来到我们的面试。今天我们想讨论一下在TypeORM中怎样为PostgreSQL数据库自动生成UUID。您能否介绍一下什么是UUID以及它在数据库中的应用?

:谢谢,很高兴有机会和您讨论这个技术问题。UUID代表的是通用唯一识别码(Universally Unique Identifier),它是一种为了能在分布式系统中无需中心数据库就能保证全球唯一性而设计的标识符。UUID的一个常见用途是在数据库中作为主键使用,这样可以避免主键冲突,特别是在多个数据库同步或大规模系统中。

面试官:非常好的解释。那么您能说明一下在TypeORM中如何实现自动生成UUID的功能吗?

:当然可以。在TypeORM中,我们可以通过使用PostgreSQL的uuid类型和默认函数uuid_generate_v4()来实现自动生成UUID。首先,需要确保PostgreSQL数据库已经安装了uuid-ossp模块,因为uuid_generate_v4()函数是这个模块提供的。

sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

接下来,在TypeORM中定义实体时,可以在列装饰器中指定列的类型为uuid并设置默认值为uuid_generate_v4()。例如:

typescript
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn('uuid', { default: () => 'uuid_generate_v4()' }) id: string; @Column() name: string; }

在这个例子中,每当创建一个新的User实例并将其存入数据库时,PostgreSQL会自动为id字段生成一个新的UUID。

面试官:这是个很实用的例子,谢谢您的分享。在实际使用中,使用UUID作为主键会有什么潜在的性能影响吗?

:使用UUID作为主键主要的潜在影响是其大小和随机性。UUID是128位的,相比于传统的递增整型主键,它占用更多的存储空间。此外,由于UUID是随机生成的,它们的插入可能会导致数据库索引的频繁重建,这可能会影响插入操作的性能。然而,对于大多数应用来说,这种性能影响是可以接受的,特别是考虑到UUID带来的好处,如易于扩展和避免冲突等。

面试官:非常详尽的答复,感谢您的参与和分享。您对TypeORM和PostgreSQL的理解让我们印象深刻。

2024年8月3日 16:34 回复

你的答案