我已经用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‘不存在
当我手动插入表时,我得到了错误:
字段列表: ER_BAD_FIELD_ERROR:‘
list’中的未知列'hash‘
所以看起来TypeORM不会生成表/列。有人知道为什么会这样吗?
发布于 2020-01-22 07:07:12
尽管前面的答案对于开发环境是可以接受的,但是对于生产来说它们是错误的。
您正在寻找的是迁移。迁移在建立连接并记录时执行-任何迁移都不会运行多次。TypeORM还提供了命令行工具,允许您生成迁移(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还允许您运行迁移,从而在将更改推送到生产环境之前对其进行测试。
发布于 2019-01-04 06:40:45
连接具有“synchronize()”方法。您可以使用它自动创建表和列:
const connection = await createConnection(...);
await connection.synchronize();
发布于 2019-09-20 17:11:04
通过将以下内容添加到ormconfig.json/js/xml/etc
synchronize: true
如果表不存在,它会创建一次表。
https://stackoverflow.com/questions/46843385
复制相似问题