【问题标题】:TypeORM does not create tables, columns etcTypeORM 不创建表、列等
【发布时间】:2018-04-01 06:54:31
【问题描述】:

我已经使用 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: 表 'typeorm2.user_password' 不存在

当我手动插入表格时出现错误:

QueryFailedError:ER_BAD_FIELD_ERROR:“字段列表”中的未知列“哈希”

所以看起来 TypeORM 不会生成表/列。有谁知道为什么会这样?

【问题讨论】:

  • 你好,我也遇到了这个问题,你解决了吗?

标签: typeorm


【解决方案1】:

尽管前面的答案对于开发环境是可以接受的,但它们对于生产环境是错误的

您正在寻找的是迁移。在建立连接并记录迁移时执行迁移 - 不会多次运行迁移。 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
})

迁移由两部分组成 - up(迁移代码)和 down(恢复迁移的代码)。简单例子:

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 还允许您运行迁移,因此在将更改推送到生产之前对其进行测试。

【讨论】:

  • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;而是根据guide提供答案
  • 感谢@Anna,我更新了答案以提供足够的信息。
  • 问题是关于实体没有同步他们应该与synchronize: true 同步的表。但这个答案是关于数据库迁移的。
  • 你绝对不应该在生产环境中使用synchronize: true。答案确实回答了这个问题,因为 OP 的问题是关于同步和未创建表的问题。
  • @JiriKralovec 为什么不应该在产品中使用synchronize: true?我不是在质疑那句话,我只是不确定我是否打算使用它。
【解决方案2】:

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

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

【讨论】:

  • 您好,是否可以在应用程序在生产模式下运行后自动创建新表并运行迁移?我的问题:stackoverflow.com/questions/56617592/…
  • @JerryChong 我想是的。它适用于我的情况:) 你可以在开发时尝试它。只有 2 行。
【解决方案3】:

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

synchronize: true  

如果表不存在则创建一次。

【讨论】:

    【解决方案4】:

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

    @Entity({ name: 'User' })
    

    【讨论】:

      【解决方案5】:

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

      这应该可以工作

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

      【讨论】:

        【解决方案6】:

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

        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.
             ]
        }
        

        【讨论】:

          【解决方案7】:

          我切换到 typeorm 版本 0.1.0-alpha.40 在创建连接时具有选项 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,
          })
          

          【讨论】:

          • 此选项在 typeorm 的第一个版本中出现。顺便说一句,您使用的是旧版本的 TypeORM。当前版本是 0.1.1,autoSchemaSync: true 现在只是 synchronize: true
          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            类似于 Jose Miguel 的回答

            如果您第一次使用typeorm-model-generator 将实体从数据库生成到代码,那么typeorm-model-generator 可能会使用类似的方式生成您的代码。

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

            我删除了{ schema: 'public' } 离开它就像

            @Entity('yourTableName')
            

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

            【讨论】:

              【解决方案10】:

              我有同样的问题。只需添加

              ...
              synchronize: true,
              ...
              

              到 TypeOrm 配置

              【讨论】:

                猜你喜欢
                • 2021-05-20
                • 2020-11-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-12-05
                • 2020-12-05
                相关资源
                最近更新 更多