使用查询生成器删除数据库条目(如果已过期)(基于日期)

时间:2020-01-11 12:40:57

标签: typeorm

我想从数据库中删除所有已经失效的无效json网络令牌。我正在使用TypeORM,我想必须为此使用查询生成器。

我的令牌实体有一列代表令牌过期的时间

  @Column()
  public expiresOn: Date;

我想设置一个cronjob,从数据库中删除所有过期的令牌。所以我现在有

  @Interval(2000) // gets called every 2 seconds - for demo purposes
  public async handleInterval(): Promise<void> {
    const currentDate: Date = new Date();

    const deleteExpiredTokensQuery: SelectQueryBuilder<Token> = this.tokensRepository.createQueryBuilder('token');
    deleteExpiredTokensQuery.where('token.expiresOn <= :currentDate', { currentDate });

    await deleteExpiredTokensQuery.delete();
  }

不幸的是,尽管令牌在

上过期,但没有令牌被删除
1970-01-19 07:32:20.093

那么如何解决我的查询?我认为普通查询会是

DELETE FROM tokens WHERE expiresOn < GETDATE()

更新

我认为我必须创建一个删除查询生成器

const deleteExpiredTokensQuery: DeleteQueryBuilder<Token> = this.tokensRepository.createQueryBuilder('token');

但是我得到这个错误

类型'SelectQueryBuilder'缺少以下属性 来自“ DeleteQueryBuilder”类型的信息:输出,返回, createDeleteExpression

1 个答案:

答案 0 :(得分:1)

通过在delete()上调用QueryBuilder,仅将此查询声明为删除。要执行查询,您必须调用execute()。参见docs for delete

await this.tokensRepository
    .createQueryBuilder('token')
    .delete()
    .where('token.expiresOn <= :currentDate', { currentDate })
    .execute();

关于第二个问题:您不必显式指定变量的类型,因为它会自动推断出来。