web-dev-qa-db-ja.com

TypeORMがテーブルや列などを作成しない

Typeorm( https://github.com/typeorm/typeorm )とNEST( https://github.com/nestjs/nest )でシステムをセットアップしました、しかしTypeORMはテーブルやカラムを作成していません。私の設定は次のとおりです:

import {UserPassword} from '../user/user-password.entity';
import {User} from '../user/user.entity';

createConnection({
    type: 'mysql',
    Host: 'typeorm2.cn32tstd6wqk.eu-central-1.rds.amazonaws.com',
    port: 1234,
    username: 'username',
    password: 'password',
    database: 'dbname',
    entities: [
      // __dirname + '/../**/*.entity{.ts,.js}'
      UserPassword,
      User
    ]
  })

エンティティは次のとおりです。

import {Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn} from 'typeorm';

@Entity()
export class UserPassword {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  hash: string;

  @Column()
  algorithm: string;

}

そして

import {Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn} from 'typeorm';
import {UserPassword} from './user-password.entity';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 35 })
  firstName: string;

  @Column({ length: 35 })
  lastName: string;

  @Column({ length: 50})
  mail: string;

  @OneToOne(type => UserPassword)
  @JoinColumn()
  password: UserPassword;

}

それから私はこのようなユーザーを作成しようとします:

// ... some code
await this.userPasswordRepository.save(userPassword);
return await this.userRepository.save(user);

しかし、次のエラーが発生します。

QueryFailedError: ER_NO_SUCH_TABLE: Table 'typeorm2.user_password' doesn't exist

テーブルを手動で挿入すると、エラーが発生します。

QueryFailedError: ER_BAD_FIELD_ERROR: Unknown column 'hash' in 'field list'

したがって、typeormはテーブル/列を生成しないようです。なぜこれが起こり得るのか誰か知っていますか?

8
bersling

接続には「synchronize()」メソッドがあります。これを使用して、テーブルと列を自動的に作成できます。

const connection = await createConnection(...);
await connection.synchronize();
12
Bogdan Surai

以下をormconfig.json/js/xml/etcに追加します。

synchronize: true  

テーブルが存在しない場合は、一度作成します。

3
wallena3

以前の回答はdevelopment環境では許容されますが、本番環境では間違っています

あなたが探しているのはマイグレーションです。移行は、接続が確立されて記録されたときに実行されます。移行は2回以上実行されません。 TypeORMは、移行を生成できるようにするCLI( 詳細はこちら )も提供し、移行の作成を大幅に高速化します。 TypeORMは、各移行をタイムスタンププレフィックスでマークし、それらが適切な順序で実行されるようにします。移行を最初にプライマリテーブルで実行し、場合によってはサポートテーブルで実行することもできます。接続を構成するとき、次のようにマイグレーションをロードします。

createConnection({
    type: 'mysql',
    Host: 'typeorm2.cn32tstd6wqk.eu-central-1.rds.amazonaws.com',
    port: 1234,
    username: 'username',
    password: 'password',
    database: 'dbname',
    entities: [
      // __dirname + '/../**/*.entity{.ts,.js}'
      UserPassword,
      User
    ],
    migrations: ['./migrations/*.js'],
    synchronize: false
  })

移行は、up(移行コード)とdown(移行を元に戻すコード)の2つの部分で構成されます。簡単な例:

import { MigrationInterface, QueryRunner } from 'typeorm';

export class AddImageToUser implements MigrationInterface {

  async up(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.query(
       'ALTER TABLE "user" ADD image varchar(255)'
    );
  }
  async down(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.query(
       'ALTER TABLE "user" DROP COLUMN image'
    );
  }

}

詳細については、TypeORMの公式Gitリポジトリに関する詳細な説明 here を参照してください。

一般に、データとスキーマの同期をフレームワークに任せるのはよくありません。これは、データベーススキーマが確実に保持されるようにするために、ユーザーが実行する必要があることです。以前にリンクしたCLIでは、移行を実行できるため、変更を本番環境にプッシュする前にテストできます。

2
Jiri Kralovec

Typeormバージョン.1.0-alpha.4に切り替えましたが、接続の作成時にオプションautoSchemaSyncがあり、機能しました。

createConnection({
  type: 'mysql',
  Host: 'typeorm2.cn32tstd6wqk.eu-central-1.rds.amazonaws.com',
  port: 1234,
  username: 'username',
  password: 'password',
  database: 'dbname',
  entities: [
    // __dirname + '/../**/*.entity{.ts,.js}'
    UserPassword,
    User
  ],
  autoSchemaSync: true,
})
2
bersling

私にとっての問題は、移行を生成したいエンティティがエクスポートされたクラスではないということでした。

0
pbn

「Entity()」デコレーターにモデルの名前を追加するのに役立ちました:

@Entity({ name: 'User' })
0