TypeORM:PostgreSQL 中自动生成的 UUID

问题描述 投票:0回答:6

我正在编写一个 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列......请?

postgresql typescript uuid typeorm
6个回答
116
投票

尝试:

@PrimaryGeneratedColumn("uuid")
id: string;

另外,如果你不需要主列,但需要生成uuid序列,你可以尝试这个:

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

29
投票

从 Typeorm 版本

0.1.16
开始,装饰器
@PrimaryGeneratedColumn
支持所有数据库的
uuid

用途:

@Entity()
class MyClass {

  @PrimaryGeneratedColumn('uuid')
  id: string;

}

如果您的 Postgres 版本尚未包含

uuid-ossp
(用于生成 UUID),您可以使用
create extension "uuid-ossp";
安装它。


10
投票

对我来说,我用这个形状

@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()',
        }, 

在模型组件中,我设置 id 如下:

@Entity('<table_name>') 
class SvcRequest {
  @PrimaryGeneratedColumn('uuid')
  id: string;

希望有帮助


3
投票

实施其他人讨论过的更改后。具体就我而言:

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

我还必须让 TypeOrm 将更改同步到我的数据库表。我已在 OrmConfig.json 中将同步设置为 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 作为我的主键。这里主要是为了迁移的目的。我所知道的是它是独一无二的,并且在开发环境中还没有发生过冲突。您可以尝试将 NOT NULL 和 UNIQUE 替换为 PRIMARY KEY。

© www.soinside.com 2019 - 2024. All rights reserved.