簡體   English   中英

在 NestJS / TypeOrm / Postgres 中插入實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM