我已经建立了一个带有 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/