typescript - TypeORM: automatiskt genererat UUID i PostgreSQL
Jag skriver ett REST API och för dataåtkomst använder jag TypeORM. Jag har använt detta framgångsrikt men jag skulle vilja ha en UUID som automatiskt genereras som primärnyckel på en av mina tabeller.
Vet någon hur man ställer in en kolumn i TypeORM som är av UUID-typ och auto-genererad? Jag har försökt följande:
Använder @PrimaryGeneratedColumn()
@PrimaryGeneratedColumn() id: string;
Detta ger mig ett undantag när jag synkroniserar med databasen:
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)
Använder @PrimaryColumn och @Generated
@PrimaryColumn({type:"uuid"})
@Generated("uuid") id: string;
Jag får följande fel när jag försöker detta:
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)
Så det ser ut som att på detta sätt kan jag få en primär kolumn, men TypeORM skapar inte den sekvens som krävs för att detta ska vara en automatisk genererad kolumn.
Om jag använder @PrimaryColumn({type: "uuid"}) så får jag en UUID-kolumn i tabellen men INTE en självgenererad kolumn.
Jag kan inte se något annat sätt att uppnå detta, så kan någon vänligen ge råd om detta a) ens är möjligt och b) hur man skulle gå tillväga för att skapa en automatiskt genererad UUID-kolumn...snälla?
Svar #1
Försök :
@PrimaryGeneratedColumn("uuid")
id: string;
Också, om du inte behöver en primär kolumn, men behöver generera uuid-sekvens, kan du prova detta:
@Column()
@Generated("uuid")
uuid: string;
Svar #2
Från och med Typeorm version 0.1.16 stöder dekoratorn @PrimaryGeneratedColumn uuid för alla databaser.
Användning:
@Entity()
class MyClass {
@PrimaryGeneratedColumn('uuid')
id: string;
}
Om din version av Postgres inte redan inkluderar uuid-ossp (används för att generera UUID), kan du installera det med create extension "uuid-ossp";.
Svar #3
för mig, jag använder denna form
@PrimaryGeneratedColumn('uuid')
id: string
vi kan använda en annan form du bör installera UUID-paketet
@PrimaryColumn() id:string och använde @BeforeInsert() genarate(){ this.id=uuid()
Svar #4
I migreringen kunde du försöka sätta standardvärdet med uuid_generate_v4() på detta sätt:
enter columns: [
{
name: 'id',
type: 'varchar',
isPrimary: true,
generationStrategy: 'uuid',
default: 'uuid_generate_v4()',
},
I Modellkomponenten satte jag id:t som nedan:
@Entity('<table_name>')
class SvcRequest {
@PrimaryGeneratedColumn('uuid')
id: string;
hoppas det hjälper
