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