[英]Insert entity in NestJS / TypeOrm / Postgres
這是我的實體:
import { BaseEntity, Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { Client } from './client.entity';
@Entity({ name: 'directory_dir' })
export class Directory extends BaseEntity {
@PrimaryGeneratedColumn("uuid", { name: 'dir_id' })
id: string;
@Column( { name: 'dir_name' } )
name: string;
@JoinColumn({ name: 'cli_client_id'})
@ManyToOne(() => Client, { eager: true })
client: Client;
}
該表是通過 liquibase 創建的:
<changeSet id="3" author="Me">
<createTable tableName="DIRECTORY_DIR">
<column name="DIR_ID" type="uuid">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="DIR_NAME" type="varchar(64)">
<constraints nullable="false"/>
</column>
<column name="CLI_CLIENT_ID" type="uuid">
<constraints nullable="false" foreignKeyName="FK_DIRECTORY_DIR_CLI_CLIENT_ID" references="CLIENT_CLI(CLI_ID)"/>
</column>
</createTable>
</changeSet>
我很難將它插入數據庫。 我嘗試了幾種語法,但每次都會出現錯誤,因為 id 不是自動生成的:
null 關系“directory_dir”的列“dir_id”中的值違反了非空約束
我試過這個:
const directory = new Directory();
/* Also tried this one
* const directory = this.directoryRepository.create({
* name: makeDirRequest.name,
* client: user.client
* });
*/
directory.name = makeDirRequest.name;
directory.client = user.client;
this.logger.log('directory', JSON.stringify(directory));
// Also tried with insert instead of save
return await this.directoryRepository.save(directory);
在日志中,我可以看到沒有dir_id
,但按照我的理解,這應該不是問題,因為我希望 TypeOrm 在生成INSERT
語句時這樣做。
當我使用 SQL 語句在數據庫中插入實體時,我可以很容易地從 typeORM 中找到它們,因此 typeORM 配置看起來沒問題。
問題來自 PostgreSQL 中表的定義。必須提供默認值以解釋如何自動生成主鍵。
在 Liquibase 中像這樣聲明列可以完成這項工作:
<column name="DIR_ID" type="uuid" defaultValue="gen_random_uuid()">
<constraints primaryKey="true" nullable="false"/>
</column>
我剛剛添加了defaultValue="gen_random_uuid()"
。
gen_random_uuid()
是新的uuid_generate_v4()
,可從 Postgres 13 獲得
從這一點來看,我可以創建實體並像這樣插入它:
return await Directory.create({
name: makeDirRequest.name,
client: user.client
}).save();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.