AfterUpdate 中的查询在 TypeORM 中未按预期工作
Queries in AfterUpdate are not working as expected in TypeORM
我在 TypeORM 中有一个实体包含一组其他子实体:
MyEntity
children (OneToMany)
当我删除一个子实体(例如 ID = 2)并保存该实体时,子实体中的框架会按预期触发更新 table:
UPDATE "my_children_table" SET "myEntityId" = null WHERE "id" = 2
我还有一个订阅者收听更新后的事件,该事件也按预期触发。但是,更新不会删除该条目。该条目现在是孤立的,关系 ID 为空。在下面的示例中,我使用订户清理孤立实体:
@EventSubscriber()
export class MyChildSubscriber implements EntitySubscriberInterface<MyChildEntity> {
public listenTo(): string | Function {
return MyChildEntity;
}
public async afterUpdate(event: LoadEvent<MyChildEntity>) {
console.log('It works! The event is triggered as expected!');
const builder = event.connection
.createQueryBuilder()
.delete()
.from(MyChildEntity)
.where('"myEntityId" IS NULL');
return builder.execute();
}
}
然而,当查询超过 运行s 时,更新还没有 运行,所以没有从数据库中删除任何内容。我期待删除删除孤立的行。
根据 TypeORM 日志,查询按以下顺序执行:
START TRANSACTION
UPDATE "my_children_table" SET "myEntityId" = WHERE "id" = -- PARAMETERS: [2,null]
DELETE FROM "my_children_table" WHERE "myEntityId" IS NULL
COMMIT
如果我直接在我的数据库中 运行 相同的事务(我使用的是 PostgreSQL),一切都按预期工作,但 TypeORM 的行为与更新之前的删除 运行 一样。
你能帮我理解我做错了什么吗?
我通过提交当前事务(所以数据被保存到数据库)并开始一个新事务来解决它,所以TypeORM稍后会提交这个新事务。我返回了我的查询执行(一个承诺)以确保 TypeORM 将等待它:
public async afterUpdate(event: LoadEvent<MyChildEntity>) {
await event.queryRunner.commitTransaction();
await event.queryRunner.startTransaction();
return event.manager
.createQueryBuilder()
.delete()
.from(MyChildEntity)
.where('"myEntityId" IS NULL')
.execute();
}
我在 TypeORM 中有一个实体包含一组其他子实体:
MyEntity
children (OneToMany)
当我删除一个子实体(例如 ID = 2)并保存该实体时,子实体中的框架会按预期触发更新 table:
UPDATE "my_children_table" SET "myEntityId" = null WHERE "id" = 2
我还有一个订阅者收听更新后的事件,该事件也按预期触发。但是,更新不会删除该条目。该条目现在是孤立的,关系 ID 为空。在下面的示例中,我使用订户清理孤立实体:
@EventSubscriber()
export class MyChildSubscriber implements EntitySubscriberInterface<MyChildEntity> {
public listenTo(): string | Function {
return MyChildEntity;
}
public async afterUpdate(event: LoadEvent<MyChildEntity>) {
console.log('It works! The event is triggered as expected!');
const builder = event.connection
.createQueryBuilder()
.delete()
.from(MyChildEntity)
.where('"myEntityId" IS NULL');
return builder.execute();
}
}
然而,当查询超过 运行s 时,更新还没有 运行,所以没有从数据库中删除任何内容。我期待删除删除孤立的行。
根据 TypeORM 日志,查询按以下顺序执行:
START TRANSACTION
UPDATE "my_children_table" SET "myEntityId" = WHERE "id" = -- PARAMETERS: [2,null]
DELETE FROM "my_children_table" WHERE "myEntityId" IS NULL
COMMIT
如果我直接在我的数据库中 运行 相同的事务(我使用的是 PostgreSQL),一切都按预期工作,但 TypeORM 的行为与更新之前的删除 运行 一样。
你能帮我理解我做错了什么吗?
我通过提交当前事务(所以数据被保存到数据库)并开始一个新事务来解决它,所以TypeORM稍后会提交这个新事务。我返回了我的查询执行(一个承诺)以确保 TypeORM 将等待它:
public async afterUpdate(event: LoadEvent<MyChildEntity>) {
await event.queryRunner.commitTransaction();
await event.queryRunner.startTransaction();
return event.manager
.createQueryBuilder()
.delete()
.from(MyChildEntity)
.where('"myEntityId" IS NULL')
.execute();
}