typeorm:在postgresql中自动生成UUID

时间:2017-12-05 10:37:02

标签: postgresql typescript uuid typeorm

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

5 个答案:

答案 0 :(得分:5)

对我来说,我用这个形状

@PrimaryGeneratedColumn('uuid')
  id: string

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

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

答案 1 :(得分:4)

尝试:

@PrimaryGeneratedColumn("uuid")
id: string;

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

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

答案 2 :(得分:4)

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

<强>用法:

@Entity()
class MyClass {

  @PrimaryGeneratedColumn('uuid')
  id: string;

}

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

答案 3 :(得分:2)

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

希望有帮助

答案 4 :(得分:0)

这是我用于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。