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はテーブル/列を生成しないようです。なぜこれが起こり得るのか誰か知っていますか?
接続には「synchronize()」メソッドがあります。これを使用して、テーブルと列を自動的に作成できます。
const connection = await createConnection(...);
await connection.synchronize();
以下をormconfig.json/js/xml/etc
に追加します。
synchronize: true
テーブルが存在しない場合は、一度作成します。
以前の回答は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では、移行を実行できるため、変更を本番環境にプッシュする前にテストできます。
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,
})
私にとっての問題は、移行を生成したいエンティティがエクスポートされたクラスではないということでした。
「Entity()」デコレーターにモデルの名前を追加するのに役立ちました:
@Entity({ name: 'User' })