TypeORM 不会创建表、列等

问题描述 投票:0回答:14

我已经建立了一个带有 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
14个回答
46
投票

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

您正在寻找的是迁移。建立连接并记录时执行迁移 - 迁移不会运行多次。 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(恢复迁移的代码)。简单的例子:

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 存储库上有详细说明

这里

一般来说,将数据和模式的同步交给框架是不好的。您应该执行此操作以确保保留数据库架构。我之前链接的 CLI 还允许您运行迁移,因此在将更改推送到生产之前对其进行测试。


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

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

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

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

6
投票
将以下内容添加到

ormconfig.json/js/xml/etc

synchronize: true

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


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

这应该有效

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


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

@Entity({ name: 'User' })
    

3
投票
我切换到 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, })
    

3
投票
对于您的特定用例,添加

synchronize: true

 可能会解决问题,但对于面临类似问题的人来说,尽管存在 
synchronize: true
,但可能还有其他原因。其中一些是:

  1. @Entity()

    装饰你的实体,以便
    typeORM
    可以识别它并生成表格(仅当
    synchronize
    true
    时)。

  2. 将实体包含在相应模块的导入中:

@Module({ imports: [TypeOrmModule.forFeature([<Your_Entity>])], ....... })
完成这些后,将自动创建表格。但是,使用

synchronize: true

安全吗?可能是@Jiri Kralovec 回答的另一个话题。


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

如果您第一次使用

typeorm-model-generator

 生成从数据库到代码的实体,那么 
typeorm-model-generator
 可能会使用类似的内容生成您的代码。

@Entity('yourTableName', { schema: 'public' })
我删除了

{ schema: 'public' }

留下它就像

@Entity('yourTableName')
这解决了我的问题。
希望它对将来的人有所帮助:)


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


0
投票
我也有同样的问题。只需添加

... synchronize: true, ...
TypeOrm 配置


0
投票
使用 TypeORM CLI 根据数据源文件中的实体手动创建表

data-source.ts:

typeorm-ts-node-commonjs schema:sync --dataSource data-source.ts
如果数据源文件是JavaScript,则可以使用以下命令:

typeorm schema:sync --dataSource data-source.js
    

0
投票
自动创建或更新TypeORM中的数据库表、列和其他模式元素, 在连接选项中设置

synchronize: true


-1
投票
我有一个愚蠢的问题。

所有配置都是正确的,只是我的实体文件在所有更改后没有保存。

一定要打开自动保存。

© www.soinside.com 2019 - 2024. All rights reserved.