[英]Select items in TypeORM migration
我正在尝试向表中添加一列。 此外,我必须根据现有数据在创建的列中插入一个 object。 问题是当我修改表时,我试图 select 表中的所有项目,但查询卡住了(请参阅日志中的“获取事件”)。
这是我的代码:
async up(queryRunner: QueryRunner): Promise<any> {
Logger.debug('Start migration');
Logger.debug('Table modification');
await queryRunner.addColumn(
'sport_events',
new TableColumn({
name: 'url_keys',
type: 'hstore',
isNullable: true,
}),
);
Logger.debug('Create repo');
const repo = queryRunner.connection.getRepository(SportEvent);
Logger.debug('Get events');
let events = await repo.createQueryBuilder().getMany();
Logger.debug('Modify events');
events = events.map((event) => {
const keys = {};
for (const [key, val] of Object.entries(event.name)) {
keys[key] = generateURLId(val as string, key);
}
event.URLKeys = keys;
return event;
});
Logger.debug('Save modified events');
await repo.save(events);
Logger.debug('Done');
}
日志:
[Nest] 25628 - 07/17/2020, 12:00:28 PM Start migration +504ms
[Nest] 25628 - 07/17/2020, 12:00:28 PM Table modification +0ms
[Nest] 25628 - 07/17/2020, 12:00:28 PM Create repo +454ms
[Nest] 25628 - 07/17/2020, 12:00:28 PM Get events +0ms
如果在调用.getMany()
之前将显式select(...)
添加到查询构建器,会发生什么情况?
此外,此查询是否会像这样一次返回可管理数量的结果来处理?
我也遇到过这个问题。 提交事务然后重新启动另一个可以防止这种情况。
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user" ADD "luck" integer`);
await queryRunner.commitTransaction();
await queryRunner.startTransaction();
const users = await User.find();
await Promise.all(
users.map((u) => {
u.luck = Math.floor(Math.random() * 101);
return u.save();
})
);
await queryRunner.query(
`ALTER TABLE "user" ALTER COLUMN "luck" SET NOT NULL`
);
}
值得注意的是,如果您不启动另一个事务,迁移将正常进行,但 output 控制台中会出现错误,因为在迁移 function 解决后, queryRunner
可能typeorm
调用 queryRunner 上的commitTransaction
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.