繁体   English   中英

TypeORM 迁移中的 Select 项

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM