TypeORM 不创建表、列等

标签 typeorm

我已经建立了一个带有 typeorm ( https://github.com/typeorm/typeorm ) 和 NestJs ( 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 不会生成表/列。有谁知道为什么会这样?

最佳答案

即使以前的答案对于 来说是可以接受的发展 环境,他们是 生产错误 .
您正在寻找的是迁移。建立连接并记录迁移时执行迁移 - 不会多次运行迁移。 TypeORM 还提供了 CLI,它允许您生成迁移( read more here ),从而使创建它们的速度更快。 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
})
迁移由两部分组成 - 向上 (迁移代码)和 (恢复迁移的代码)。简单的例子:
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 不创建表、列等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46843385/

相关文章:

node.js - 验证类验证器中的空白区域

mysql - 使用 typeorm 对多列进行排序

typescript - 如何在 type-graphql 中为联合类型执行字段解析器

javascript - TypeORM 自定义装饰器

TypeORM 多态关系

many-to-many - TypeORM多对多检索所有关系

node.js - NestJS nodejs 在一个带有关系的查询中加载嵌套评论?

many-to-many - NestJs使用连接表更新多对多关系

typescript - TypeORM OneToMany 导致 "ReferenceError: Cannot access ' <Entity >' before initialization"

typescript - Nest.js + TypeORM + OpenApi 中虚拟(计算)列的最佳实践