typeorm:PostgreSQL中的自动生成的UUID



我正在编写一个REST API,对于数据访问,我正在使用TypeOmm,我已经成功使用了此API,但是我想在我的一个表上使用UUID自动生成的主键。

任何人都知道如何设置UUID类型和自动生成的Typeorm中的列,我尝试了以下内容:

使用@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列,但是 and of auto-enerated column

我看不到任何其他方法可以实现这一目标,所以有人可以建议如果这是a)甚至可能的,b)如何创建自动生成的UUID列...请?

尝试:

@PrimaryGeneratedColumn("uuid")
id: string;

另外,如果您不需要主列,但需要生成UUID序列,则可以尝试以下操作:

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

与Typeorm版本0.1.16一样,Decorator @PrimaryGeneratedColumn支持所有数据库的uuid

用法:

@Entity()
class MyClass {
  @PrimaryGeneratedColumn('uuid')
  id: string;
}

如果您的Postgres版本不包括uuid-ossp(用于生成UUID),则可以使用create extension "uuid-ossp";安装。

在迁移中您可以尝试使用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;

希望它有帮助

对我来说,我使用此形状

@PrimaryGeneratedColumn('uuid')
  id: string

我们可以使用另一种形状您应该安装UUID软件包

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

在影响其他人谈论的更改之后。特别是我的情况:

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

我还必须让typeorm同步数据库表的更改。我已经将同步设置为ormconfig.json中的false,这就是为什么更改没有生效的原因。因此,还可以通过设置来实现更改:

  "synchronize": true

在您的ORM配置中。

这是我用于Postgres 9.6和10的用途。默认情况下生成UUID。

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

但是,我没有将UUID用作我的主要键。这主要用于迁移目的。我所知道的是,它的独特之处,并且在开发环境中还没有发生碰撞。您可以尝试使用主键替换而不是null和唯一。

最新更新