我正在编写一个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和唯一。