我正在编写一个 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列......请?
尝试:
@PrimaryGeneratedColumn("uuid")
id: string;
另外,如果你不需要主列,但需要生成uuid序列,你可以尝试这个:
@Column()
@Generated("uuid")
uuid: string;
从 Typeorm 版本
0.1.16
开始,装饰器 @PrimaryGeneratedColumn
支持所有数据库的 uuid
。
用途:
@Entity()
class MyClass {
@PrimaryGeneratedColumn('uuid')
id: string;
}
如果您的 Postgres 版本尚未包含
uuid-ossp
(用于生成 UUID),您可以使用 create extension "uuid-ossp";
安装它。
对我来说,我用这个形状
@PrimaryGeneratedColumn('uuid')
id: string
我们可以使用其他形状 你应该安装
UUID
软件包
@PrimaryColumn() id:string
并使用了 @BeforeInsert() genarate(){ this.id=uuid()
在迁移中,您可以尝试使用 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;
希望有帮助
实施其他人讨论过的更改后。具体就我而言:
@Column({ primary: true, generated: 'uuid' })
id: string;
我还必须让 TypeOrm 将更改同步到我的数据库表。我已在 OrmConfig.json 中将同步设置为 false,这就是更改未生效的原因。因此,还可以通过设置启用 TypeOrm 来实现更改:
"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 作为我的主键。这里主要是为了迁移的目的。我所知道的是它是独一无二的,并且在开发环境中还没有发生过冲突。您可以尝试将 NOT NULL 和 UNIQUE 替换为 PRIMARY KEY。