首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >TypeORM不创建表、列等

TypeORM不创建表、列等
EN

Stack Overflow用户
提问于 2017-10-20 14:21:03
回答 11查看 37.2K关注 0票数 17

我已经用typeorm (https://github.com/typeorm/typeorm)和NestJs (https://github.com/nestjs/nest)设置了一个系统,但是TypeORM没有创建表或列。我的设置如下:

代码语言:javascript
复制
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
    ]
  })

实体是:

代码语言:javascript
复制
import {Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn} from 'typeorm';

@Entity()
export class UserPassword {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  hash: string;

  @Column()
  algorithm: string;

}

代码语言:javascript
复制
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;

}

然后我尝试创建一个用户,如下所示:

代码语言:javascript
复制
// ... some code
await this.userPasswordRepository.save(userPassword);
return await this.userRepository.save(user);

但我得到以下错误:

QueryFailedError: ER_NO_SUCH_TABLE:表'typeorm2.user_password‘不存在

当我手动插入表时,我得到了错误:

字段列表: ER_BAD_FIELD_ERROR:‘

list’中的未知列'hash‘

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

EN

回答 11

Stack Overflow用户

发布于 2020-01-22 07:07:12

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

您正在寻找的是迁移。迁移在建立连接并记录时执行-任何迁移都不会运行多次。TypeORM还提供了命令行工具,允许您生成迁移(read more here),从而大大加快了创建迁移的速度。TypeORM还使用时间戳前缀标记每个迁移,以确保它们将按正确的顺序运行-有时您可能希望首先在主表中运行迁移,有时在支持表上运行迁移。在配置连接时,您可以像这样加载迁移:

代码语言:javascript
复制
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 (恢复迁移的代码)。简单的例子:

代码语言:javascript
复制
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还允许您运行迁移,从而在将更改推送到生产环境之前对其进行测试。

票数 27
EN

Stack Overflow用户

发布于 2019-01-04 06:40:45

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

代码语言:javascript
复制
const connection = await createConnection(...);
await connection.synchronize();
票数 21
EN

Stack Overflow用户

发布于 2019-09-20 17:11:04

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

代码语言:javascript
复制
synchronize: true  

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46843385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档