TypeORM:在PostgreSQL中自动生成UUID

41

我正在编写一个REST API,使用typeorm进行数据访问。我已经成功地使用了它,但我想在我的某个表上拥有一个UUID自动生成的主键。

请问有人知道如何设置typeorm中的UUID类型且自动生成的列吗? 我已经尝试过以下方法:

使用@PrimaryGeneratedColumn()

@PrimaryGeneratedColumn() id: string;

当我尝试与数据库同步时,这会导致出现异常。

TypeORM connection error: Error: column "id" cannot be cast automatically to type integer
app.ts:65
at new QueryFailedError (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/typeorm/error/QueryFailedError.js:27:28)
at Query.callback (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:216:38)
at Query.handleError (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/pg/lib/query.js:143:17)
at Connection.connectedErrorHandler (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/pg/lib/client.js:132:26)
at emitOne (events.js:115:13)
at Connection.emit (events.js:210:7)
at Socket.<anonymous> (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/pg/lib/connection.js:118:12)
at emitOne (events.js:115:13)
at Socket.emit (events.js:210:7)
at addChunk (_stream_readable.js:266:12)

使用@PrimaryColumn@Generated

@PrimaryColumn({type:"uuid"})
@Generated("uuid") id: string;

尝试这个时,我遇到了以下错误

TypeORM connection error: Error: sequence "SystemUser_id_seq" does not exist
app.ts:65
at new QueryFailedError (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/typeorm/error/QueryFailedError.js:27:28)
at Query.callback (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/typeorm/driver/postgres/PostgresQueryRunner.js:216:38)
at Query.handleError (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/pg/lib/query.js:143:17)
at Connection.connectedErrorHandler (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/pg/lib/client.js:132:26)
at emitOne (events.js:115:13)
at Connection.emit (events.js:210:7)
at Socket.<anonymous> (/Users/neilstevens/repositories/Capp.co/capp/ms/ms-token-server/node_modules/pg/lib/connection.js:118:12)
at emitOne (events.js:115:13)
at Socket.emit (events.js:210:7)
at addChunk (_stream_readable.js:266:12)

看起来我可以通过这种方式获得一个主列,但是typeorm没有创建所需的序列使其成为自动生成的列。

如果我使用@PrimaryColumn({type: "uuid"}),那么我会在表中得到一个UUID列,但不会得到自动生成的列

我找不到其他方法来实现这一点,所以请问有人能否建议是否a)可能和b)如何创建自动生成的UUID列...谢谢?

6个回答

109

试一试:

@PrimaryGeneratedColumn("uuid")
id: string;

另外,如果您不需要主列,但需要生成uuid序列,可以尝试以下方法:

@Column()
@Generated("uuid")
uuid: string;

typeorm的装饰器参数还包括“increment”、“rowid”和“identity”。有人知道它们的用例吗?我知道“increment”的用法,但其他两个呢? - aryankarim
1
@aryankarim,文档中描述了https://typeorm.io/decorator-reference#primarygeneratedcolumn - D.Zotov

27

自 Typeorm 版本 0.1.16 起,装饰器 @PrimaryGeneratedColumn 支持在所有数据库中使用 uuid

用法:

@Entity()
class MyClass {

  @PrimaryGeneratedColumn('uuid')
  id: string;

}

如果您的Postgres版本尚未包含用于生成UUID的uuid-ossp,则可以使用create extension "uuid-ossp";进行安装。


9

对于我来说,我使用这种形状

@PrimaryGeneratedColumn('uuid')
  id: string

我们可以使用其他的形状, 您应该安装UUID包。

@PrimaryColumn() id:string并且使用 @BeforeInsert() genarate(){ this.id=uuid()


8
在迁移中,您可以尝试使用uuid_generate_v4()来设置默认值,如下所示:
enter columns: [
        {
          name: 'id',
          type: 'varchar',
          isPrimary: true,
          generationStrategy: 'uuid',
          default: 'uuid_generate_v4()',
        }, 

在 Model 组件中,我将 ID 设置如下:
@Entity('<table_name>') 
class SvcRequest {
  @PrimaryGeneratedColumn('uuid')
  id: string;

希望这能有所帮助


3

在实施其他人所谈论的更改后,需要注意以下几点,特别是对于我的情况:

 @Column({ primary: true, generated: 'uuid' })
  id: string;

我还需要让TypeOrm将更改同步到我的数据库表中。在OrmConfig.json文件中,我将synchronize设置为false,这就是为什么更改没有生效的原因。因此,为了使TypeOrm能够生效更改,请设置:

  "synchronize": true

在你的ORM配置中。


2

我正在使用的是Postgres 9.6和10。UUID默认生成。

CREATE EXTENSION pgcrypto;

CREATE TABLE my_table
(
  uuid UUID NOT NULL UNIQUE DEFAULT gen_random_uuid()
);

然而,我并没有将UUID作为我的主键。这仅仅是为了迁移的目的而存在。我所知道的是它是唯一的,在开发环境中还没有出现冲突。您可以尝试使用PRIMARY KEY替换NOT NULL和UNIQUE。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接