TypeORM没有创建表,列等

时间:2017-10-20 06:21:03

标签: 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不会生成表/列。有谁知道为什么会这样?

9 个答案:

答案 0 :(得分:12)

即使先前的答案对于开发环境是可以接受的,但它们不适用于生产

您正在寻找的是迁移。建立连接并记录迁移时执行迁移-没有迁移将运行一次以上。 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还允许您运行迁移,并因此在将更改推送到生产环境之前对其进行测试。

答案 1 :(得分:8)

连接具有“ synchronize()”方法。您可以使用它来自动创建表和列:

const connection = await createConnection(...);
await connection.synchronize();

答案 2 :(得分:2)

我在创建连接时切换到了具有选项autoSchemaSync的typeorm版本 0.1.0-alpha.40 ,这使得它可以正常工作:

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,
})

答案 3 :(得分:2)

通过将以下内容添加到ormconfig.json/js/xml/etc

synchronize: true  

如果表不存在,它将创建一次。

答案 4 :(得分:2)

在您的ormconfig.json文件中设置“同步”-> true(布尔值)

这应该有效

{
    "type": "mysql",
    "host": "localhost",
    "port": 5432,
    "username": "root",
    "password": "root",
    "database": "Identity_Demo",
    "synchronize": true,
    "logging": true,
    "entities": ["dist/**/*.entity.js"]
 }

答案 5 :(得分:0)

对我来说,问题在于我要为其生成迁移的实体不是导出的类。

答案 6 :(得分:0)

帮助我的是将模型的名称添加到“ Entity()”装饰器中:

@Entity({ name: 'User' })

答案 7 :(得分:0)

手动指定实体而不是通配符路径名对我有用。

export let dbOptions: ConnectionOptions = {
     type: "mysql",
     host: "localhost",
     port: 3306,
     username: "root",
     password: "root",
     database: "exam",
     synchronize: true,

     entities: [
          // "./entities/*.js",     // Wildcard Path : Not working
          EmployeeEntity            // Specify the entities directly.
     ]
}

答案 8 :(得分:0)

类似于何塞·米格尔的回答

如果您第一次使用 typeorm-model-generator 生成从数据库到代码的实体,那么 typeorm-model-generator 可能已经用类似的东西生成了您的代码。

@Entity('yourTableName', { schema: 'public' })

我删除了 { schema: 'public' } 让它像

@Entity('yourTableName')

这为我解决了这个问题。 希望它在未来对某人有所帮助:)